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

Wit*_*ail 3 asp.net razor asp.net-mvc-3

这是部分的一部分:

@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
       ...  
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

小智 12

@model IEnumerable<Type>

@foreach(var item in Model)
{

    @Html.HiddenFor(model => item)

}
Run Code Online (Sandbox Code Playgroud)

Don't forget that Type must be de/serializable in order for this to work.


Bui*_*ted 6

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

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

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

@foreach(var jerk in Model) {
    @Html.EditorFor(m => jerk)
}
Run Code Online (Sandbox Code Playgroud)

或者你可以调用EditorForModel自动循环的地方并查找EditorTemplate.

@Html.EditorForModel()
Run Code Online (Sandbox Code Playgroud)

EditorFor会寻找EditorTemplate你首先创建那么它将从那里走,直到它找到一个替代,否则会输出一个MVC认为你可能需要.

  • 有关更详细的帮助,我写了一篇博文,详细介绍了如何创建它们:http://buildstarted.com/2010/09/10/overriding-displayfor-and-editorfor-to-create-custom-outputs-for-mvc / (2认同)

Joh*_*rer 5

我会改用 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
       ...  
    }
}
Run Code Online (Sandbox Code Playgroud)

如果回发时绑定对您来说并不重要,您可以简单地执行以下操作

@Html.HiddenFor(混蛋=>混蛋)