0

私は別のモデルのリストを含むモデルを持っています。のは、私がMovieModelを持っているとしましょう を:MVC Asp.net Actionlinkを使用して複雑なオブジェクトのリストをビューからコントローラに渡すにはどうすればよいですか?

public class MovieModel 
{ 
    public int MovieId { get; set; } 
    public string Title { get; set; } 
    public string Director { get; set; } 
} 

それから私はRentalModelを持っている:

public class RentalModel 
{ 
    public int RentalId { get; set; } 
    public string CustomerId { get; set; } 
    public List<MovieModel> Movies { get; set; } 
} 

その後、私はその詳細、レンタルをクリックしてますが、全てのレンタルが表示されている場所を持っています「ShowRentals.aspx」から「ShowRentalDetails.aspx」に、表示される

<% using (Html.BeginForm()) { %> 
<% foreach(var rent in Model) { %> 
<div class="editor-label">    
    <div class="editor-field">     
       <%: rent.RentalId %> 

<%: Html.ActionLink("Details", "ShowRentalDetails", 
        new {rentalId = rent.RentalId, 
        customerId = rent.CustomerId, 
        movies = rent.Movies, 
    })%>  

私はデバッグするとき、私は作品のリストは常にnullであることがわかります。これは、Idなどのプリミティブパラメータのみが正常に渡されるためです。私は決して複雑な型を渡すことができませんでした。私は実際にこのリストをコントローラに渡す必要があります。アクションリンクが機能しない可能性がありますか?その他の回避策は何ですか?私はしばらくこれに固執してきた。 ここで裸のコードを気にされないようにしてください。これは私がリストで何をやっているのかを示しています。助けてください。コントローラーで

(フォローアップ)

は、ここでは二つの作用、ShowRentalsとShowRentalDetailsです:

public ActionResult ShowRentals() 
    { 
     MembershipUser user = Membership.GetUser(User.Identity.Name, true); 
     Guid guid = (Guid)user.ProviderUserKey; 

     Entities dataContext = new Entities(); 
     Member member = dataContext.Members.Where(m => m.UserID == guid).First(); 

     IEnumerable<RentalModel> toReturn = from r in member.Rentals 
              select new RentalModel 
               { 
                RentalId = m.RentalID, 
                CustomerId = m.CustomerID, 
               }; 
     return View(toReturn); 


    } 

[Authorize] 
    public ActionResult ShowRentalDetails(RentalModel model, List<MovieModel> movies) 
    {  
     return View("ShowRentalDetails", model);   
    } 

データベース内のムービーの配列であるので、私はShowRentalsでそれを設定することはできませんMovieModelではなくムービータイプであるため、2つのリストは互換性がありません。 ShowRentalsビューから渡されたモデルではnullであり、モデルはmvcによって再構築され、アクションリンクからパラメータとして明示的に渡されたときには機能しません。助けて!

+0

オブジェクト全体を送信することが重要ですか、ムービーIDを送信してサーバーにロードできますか? –

+0

私はリスト全体を送る必要があります。それとも、モデル全体を送信するという意味ですか?いずれにしても、コントローラー側のリストにアクセスして詳細ビューページに表示する必要があります – dumbfreak

+0

コントローラーも表示できますか? – Shaokan

答えて

0

私はHtml.ActionLinkがGETを実行し、GETを使用して複雑なデータ型を渡すことはできないと考えています。

レンタルIDを使用してShowRentDetailsコントローラでムービーリストを再取得できる場合は、これが最善の策だと思います。

それ以外の場合は、EditorForテンプレートを参照できます。 MovieModel用のテンプレートeditorforを作成し、RentalModelをShowRentDetailsにポストすると、MovieModelリストをそのように取得できます。

別の方法としてhttp://weblogs.asp.net/shijuvarghese/archive/2010/03/06/persisting-model-state-in-asp-net-mvc-using-html-serialize.aspxを参照してください。 ASP.NET MVC - Trouble passing model in Html.ActionLink routeValues

+0

私はそれについて知っている、私はちょうどコントローラに映画のリストを渡す方法を見てテストしています。これは、モデル自体が更新されていないため、唯一の方法と思われました。コントローラー側に到達すると、ムービーリストはモデル内でnullを返します。 – dumbfreak

+0

また、コントローラーではムービーリストを取得できないようですデータベースにアクセスすると、私は、MovieModelタイプではなく、Movieタイプのリストしか取得できません。これは、詳細ビューで表示する必要があります。 – dumbfreak

+0

@dumbfreak私は私の答えに編集したリンクを試してください。決してそれを試みたことはありませんが、あなたが望むものがあれば、それはあなたの最善の策かもしれません – DMulligan

0

それは明らかであるあなたカントのパス:それはすでにモデル

ソースに含まれている時にサイドノートで

は、

List<MovieModel> movies 

ShowRentDetailsの2番目のパラメータを作成する必要がtheresのアクションリンクによる複雑なビューモデル。複雑な性質を持たない単純なオブジェクトを渡す可能性があります。あなたが複数の提出ボタンとして行うことができ、コントローラへの投稿をする別の方法があります。あなたは複雑なビューモデルを投稿する可能性があります

関連する問題