.NET MVC3 Html.Hidden在foreach循环内部期待一个集合?

时间:2011-07-22 02:57:11

标签: asp.net asp.net-mvc-3 razor

以下是部分内容:

@model IEnumerable<BLL.DomainModel.Jerk>

@foreach (var jerk in Model)
{
    using (Html.BeginForm("AddJerk", "Jerk", FormMethod.Post, new { @class = "jerkListForm" }))
    {
     @Html.HiddenFor(jerk => )
       @jerk.Name
       ...  
    }
}

HiddenFor lambda正在寻找的类型与@model(IEnumerable)相同,而我正在寻找IEnumerable中的单个对象。

我错过了什么?为什么它仍在寻找foreach循环中的集合?

3 个答案:

答案 0 :(得分:12)

@model IEnumerable<Type>

@foreach(var item in Model)
{

    @Html.HiddenFor(model => item)

}

不要忘记Type必须是de / serializable才能使其正常工作。

答案 1 :(得分:6)

Asp.Net MVC提供的所有Html For Helpers使用页面定义模型的模型。你可以做的是创建一个EditorTemplate。在名为EditorTemplates的View文件夹中创建一个子目录,例如在\Home\EditorTemplates\中,并添加一个名为Jerk.cshtml的新视图,并以此方式分配您的模型。

然后您可以为每个属性使用Html.HiddenFor(f => f.Name)等等。这将为您提供您期望的键入访问权限。

在主视图中,您将执行以下操作:

@foreach(var jerk in Model) {
    @Html.EditorFor(m => jerk)
}

或者您可以调用EditorForModel,它会自动循环并查找EditorTemplate。

@Html.EditorForModel()

EditorFor将查找您首先创建的EditorTemplate,然后它将从那里开始,直到它找到覆盖或输出一个MVC认为您可能需要。

答案 2 :(得分:4)

我会使用for循环代替。这样你的隐藏字段将具有正确的名称。如果您使用示例中的帮助程序,则所有隐藏字段的名称都为jerk,不会正确回发。

@foreach (var i = 0; i < Model.Count; i++)
{
    var jerk = Model[i];
    using (Html.BeginForm("AddJerk", "Jerk", FormMethod.Post, new { @class = "jerkListForm" }))
    {
     @Html.HiddenFor(model => model[i])
       @jerk.Name
       ...  
    }
}

如果在回发中绑定对您无关紧要,您只需执行

即可

@ Html.HiddenFor(jerk =&gt; jerk)