将List的项放入Html.RenderPartial(“item”,i)会丢失索引绑定上下文

时间:2014-04-05 20:20:41

标签: asp.net-mvc razor

我的IEnumberable在我的操作中是一个空参数。自从我这样做以来,绑定不再起作用了:

之前我的重构

ListItem .cshtml位于列表 .html

<table id="TeststepsDataTable">
           <tbody>
                @for (int i = 0; i < Model.Count(); i++)
                {

                    <tr>
                        @Html.HiddenFor(item => item[i].UnitId)
                        <td>
                            @Html.EditorFor(item => item[i].Name)
                        </td>                    
                    </tr>
                }
            </tbody>
        </table>

AFTER 我的重构

列表 .cshtml

<table id="TeststepsDataTable">
           <tbody>
                @for (int i = 0; i < Model.Count(); i++)
                {
                    Html.RenderPartial("ListItem", Model[i]);
                }
            </tbody>
        </table>

列表项 .cshtml

@model ITMS.Web.Models.Teststep.TeststepViewModel

<tr>
    @Html.HiddenFor(item => Model.UnitId)
    <td>
        @Html.EditorFor(item => Model.Name)
    </td>        
</tr>

单击List.cshtml中的保存按钮时,将触发此操作:

    [HttpPost]
    public ActionResult Save(IEnumerable<TeststepViewModel> teststepViewModels)
    {
        // do stuff
    }

teststepViewModels为null因为我丢失了[0] .UnitId之类的索引属性,所以modelbinder无法正确绑定属性。

我该如何解决?

我真的想使用ListItem.cshtml,因为我想将此代码重用于插入/添加操作空行。

1 个答案:

答案 0 :(得分:0)

你可以使用foreach代替

    <table id="TeststepsDataTable">
    <tbody>
        @foreach (var item in Model)
        {
            Html.RenderPartial("ListItem", item);

        }        
    </tbody>
</table>

并且你必须以这种方式绑定

<tr>
@Html.HiddenFor(item => item.UnitId)
<td>
    @Html.EditorFor(item => item.Name)
</td>        

和,锁定表达式 item =&gt; item.UnitId 而不是 item =&gt; Model.UnitId

修改

我为模型添加了索引属性

    public class UnitsViewModel
{
    public List<Unit> Units { get; set; }

    public class Unit
    {
        [HiddenInput(DisplayValue = false)]

        public int UnitId { get; set; }

        [DataType(DataType.MultilineText)]
        public string Name { get; set; }

        [DataType(DataType.MultilineText)]
        public string ErrorText { get; set; }

        public int Index { get; set; }
    }
}

在主视图中我填充索引属性:

    <table id="TeststepsDataTable">
    <tbody>
        @for (int i = 0; i < Model.Units.Count; i++)
        {
            Model.Units[i].Index = i;
            Html.RenderPartial("ListItem", Model.Units[i]);
        }
    </tbody>
</table>

并在listItem中:

@model StackOverflowSample.Models.UnitsViewModel.Unit

@Html.Hidden("Units["+ Model.Index +"].UnitId",Model.UnitId)
<td>
    @Html.TextBox("Units["+ Model.Index +"].Name",Model.Name)
</td>
<td>
    @Html.TextBox("Units["+ Model.Index +"].ErrorText",Model.ErrorText)
</td>

我将编辑器更改为TextBox,将HiddenFor更改为Hidden.it的工作;)