1

私のViewModelは次のとおりです。

public class ObjectiveVM
{
    public string DateSelected { get; set; }
    public List<string> DatePeriod { get; set; }
    public IList<ObList> obList { get; set; }
    public class ObList
    {
        public int ObjectiveId { get; set; }
        public int AnalystId { get; set; }
        public string Title { get; set; }
        public string Description { get; set; }
        public string AnalystName { get; set; }
        public bool Include { get; set; }
    }
}

これはビューに渡され、期待どおりに入力され、ビューに正しく表示されます。

私の問題は、コントローラーにポストバックされるときです。それを受け入れるための私のコントローラーコードは次のとおりです。

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Analyst(ObjectiveVM ovm)

ovm.obListは常に null として表示されます:

投稿された値を表示する

私のビューhtmlは次のとおりです。

@model Objectives.ViewModels.ObjectiveVM

@{
ViewBag.Title = "Analyst";
}
<h2>Copy Objectives for Analyst</h2>
@using (Html.BeginForm()) {
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)

<fieldset>
    <legend>Objective</legend>
    @Html.DropDownListFor(model => model.DateSelected, new SelectList(Model.DatePeriod))
<table>
<tr>
    <th>
        @Html.DisplayNameFor(model => model.obList[0].Include)
    </th>
    <th>
        @Html.DisplayNameFor(model => model.obList[0].AnalystName)
    </th>
     <th>
        @Html.DisplayNameFor(model => model.obList[0].Title)
    </th>
    <th>
        @Html.DisplayNameFor(model => model.obList[0].Description)
    </th>
</tr>

@foreach (var obList in Model.obList)
{
    <tr>
       <td>

            @Html.HiddenFor(modelItem => obList.ObjectiveId)
            @Html.HiddenFor(modelItem => obList.AnalystId)
            @Html.HiddenFor(modelItem => obList.Title)
            @Html.HiddenFor(modelItem => obList.Description)

            @Html.CheckBoxFor(modelItem => obList.Include)
        </td>
         <td>
            @Html.DisplayFor(modelItem => obList.AnalystName)
        </td>
         <td>
            @Html.DisplayFor(modelItem => obList.Title) 
         </td>
        <td>
            @Html.DisplayFor(modelItem => obList.Description)
        </td>
    </tr>
}

</table>

    <p>
        <input type="submit" value="Copy Selected Objectives" />
    </p>
</fieldset>

    }

@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}

投稿されたフォームの値で開発者ツールを見ると、問題ないように見えます。 開発者ツール

投稿されたフォームの値がコントローラーの HTTP 投稿でビューモデルにマッピングされていない理由を誰でも見ることができますか?

ありがとう、マーク

4

2 に答える 2

2

for...loopではなく、ここで使用する必要がありますforeach....loop

@for (int idx = 0;idx < Model.obList.Count;idx++){
    @Html.HiddenFor(_ => Model.obList[idx].ObjectiveId)

    // ... etc....

}

インデクサー ( idx) がないと、モデル バインダーは値を適切なコレクション アイテムにバインドする方法を認識できません。

于 2013-08-15T14:11:56.900 に答える