1

HomeController次のアクションメソッドを持つコントローラーがあります。

public ActionResult DisplayData(MyViewModel myViewModel)
{
   // Do something with myViewModel           
}

ViewModel:_

public class MyViewModel
{
    public List<string> Names { get; set; }
    public List<CustomViewModel> CustomVM { get; set; }
    public bool IsSpecial { get; set; }
}

そして、次のView

@model AppName.ViewModels.MyViewModel

@{ Html.RenderPartial("MyPartialView", Model);  }

<img src="@Url.Action("DisplayData", "Home", new RouteValueDictionary(Model))" alt="Image" />

Url.Actionここで説明されている方法を使用しますが、DisplayDataアクション メソッドで得られるものは null です。私が得たソースコードでは:

<img src="/Home/DisplayData?IsSpecial=true&amp;Name=System.Collections.Generic.List%601%5BSystem.String%5D&amp;CustomVM=System.Collections.Generic.List%601%5BVestibule.AppName.ViewModels.CustomViewModel%5D"" alt="Image" />

そのため、実際には値ではなく型を渡しています。正しく渡される唯一の変数値は bool ですIsSpecial

代わりに ViewModel が正しく部分ビューに渡されます。私は何を間違っていますか?

4

2 に答える 2

1

「問題」はリストです。MVC は、値ではなく、リスト オブジェクト自体をバインドしようとしています。コレクションのバインディングの例については、こちらを参照してください。

次のような方法で URL を生成する必要があります。

@for (int i = 0; i < Model.Names.Count(); i++)
{
 <img src="@Url.Action("DisplayData", "Home", new { IsSpecial = Model.IsSpecial, Name = Model.Names[i], CustomVM = Model.CustomVM[i].Property })" alt="Image" />
}

エラーが含まれている可能性があります。テストしていません。そして、それはあなたの場合にそれを行う最良の方法ではないかもしれません、それは単なる例です

もちろん、これはリストの長さによって異なります。長さが異なる場合、これは機能しません。

お役に立てれば。

于 2012-11-01T13:38:14.703 に答える
1

本当に両方のリストを GET アクションに渡しますか? GET は通常、べき等エンティティを取得するために予約されています。

POST を使用してデータをサーバーに送信したい場合や、これらのリストの ToString() メソッドをオーバーライドして、おそらく独自のコンテナー タイプにラップする必要がある場合があります。

于 2012-11-01T13:38:59.630 に答える