56

問題があるMVC Asp.netアプリがあります。基本的に、フォームを含むビューがあり、その内容はオブジェクトのリストにバインドされています。このループ内で、アイテムがループされている PartialView をロードします。これで、フォームの送信まですべてが機能します。送信されると、コントローラーにはオブジェクトの null リストが送信されます。以下のコードは、問題を示しています。

親ビュー:

@model IEnumerable<PlanCompareViewModel>
@using (Html.BeginForm("ComparePlans", "Plans", FormMethod.Post, new { id = "compareForm" }))
{
<div>
    @foreach (var planVM in Model)
    {
        @Html.Partial("_partialView", planVM)
    }
</div>
}

_partialView:

@model PlanCompareViewModel
<div>
    @Html.HiddenFor(p => p.PlanID)
    @Html.HiddenFor(p => p.CurrentPlan)
    @Html.CheckBoxFor(p => p.ShouldCompare)
   <input type="submit" value="Compare"/>
</div>

上記のコードのクラスは次のとおりです。

PlanViewModel:

public class PlansCompareViewModel
{

    public int PlanID { get; set; }
    public Plan CurrentPlan { get; set; }
    public bool ShouldCompare { get; set; }
    public PlansCompareViewModel(Plan plan)
    {
        ShouldCompare = false;
        PlanID = plan.PlanId;
        CurrentPlan = plan;
    }

    public PlansCompareViewModel()
    {
        // TODO: Complete member initialization
    }
    public static IEnumerable<PlansCompareViewModel> CreatePlansVM(IEnumerable<Plan> plans)
    {
        return plans.Select(p => new PlansCompareViewModel(p)).AsEnumerable();
    }
}

コントローラ:

public class PlansController : MyBaseController
{
    [HttpPost]
    public ActionResult ComparePlans(IEnumerable<PlanCompareViewModel> model)
    {
         //the model passed into here is NULL
    }
}

そして、問題はコントローラーのアクションにあります。私の知る限り、PlanCompareViewModels の列挙可能なリストを投稿する必要がありますが、null です。送信されている投稿データを検査すると、正しいパラメーターが送信されます。「IEnumerable」を「FormCollection」に変更すると、正しい値が含まれます。バインダーが正しいオブジェクトを作成していない理由を誰でも理解できますか? JavaScriptを使用してこれを回避できますが、それでは目的が果たせません! どんな助けでも大歓迎です!

4

2 に答える 2

37

これを読んでください : http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspxそれらを IEnumerable に解析します。ループ名とレンダー名をインデックスで使用する 代わりに。
planCompareViewModel[0].PlanIdplanCompareViewModel[1].PlanId
@foreach (var planVM in Model)for

于 2013-11-13T21:26:56.130 に答える