为什么我无法将此模型传递给ASP.NET MVC中的控制器

时间:2016-03-18 12:44:12

标签: c# asp.net-mvc

为什么我无法将此模型传递给ASP.NET MVC中的控制器?

这是我的观点:

@model Pro.WebUI.ViewModels.DataItemVm

<div>
    <table class="table">
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.FirstSetList.FirstOrDefault().Name)
            </th>            
            <th>
                @Html.DisplayNameFor(model => model.FirstSetList.FirstOrDefault().Amount)
            </th>
        </tr>
        @foreach (var item in Model.FirstSetList)
        {
            <tr>
                <td>
                    @Html.DisplayFor(modelItem => item.Name)
                </td>
                <td>
                    @Html.TextBoxFor(modelItem => item.Amount)
                </td>
            </tr>
        }
    </table>
    <hr/>
    <div>
        @using (Html.BeginForm())
        {
            @Html.HiddenFor(model => model.FirstSetList)
            <input type="submit" value="Confirm"/>
        }
    </div>
</div>

点击确认按钮后 - 此方法接收模型 Count = 0;

public ActionResult FirstSet(DataItemVm model)
    {
     ...
    }

当然,我的ViewModel DataItemVm 有列表:

public class DataItemVm
    {
     public List<FirstSetViewModel> FirstSetList { get; set; }
    }

所以看起来这个问题只是在视野中。也许 BeginForm 应该在其他地方?但是 HiddenFor 应该足以发送此模型。

1 个答案:

答案 0 :(得分:2)

将@foreach循环更改为for - ASP.NET MVC使用索引器为元素生成正确的ID和名称,因此您应该使用@ Html.TextBoxFor(x =&gt; x.Array [index])来正确生成html for你的收藏品。

这个周期:

@foreach (var item in Model.FirstSetList)
{
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.Name)
        </td>
        <td>
            @Html.TextBoxFor(modelItem => item.Amount)
        </td>
    </tr>
}

应该是这样的:

@for (var i = 0; i < Model.FirstSetList.Length; i++)
{
    <tr>
        <td>
            @Html.DisplayFor(model => model.FirstSetList[i].Name)
            @Html.HiddenFor(model => model.FirstSetList[i].Name) //otherwise name won't be returned to controller
        </td>
        <td>
            @Html.TextBoxFor(model=> model.FirstSetList[i].Amount)
        </td>
    </tr>
}

另一个问题是 - 您希望发送到控制器的数据的标记应放在@using (Html.BeginForm()){//put it here}块内。

查看这篇关于ASP.NET MVC中模型绑定的帖子: http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx/