[英]Passing back a single object when using EditorFor(model[])
一段时间以来,这一直困扰着我。 如果我在对象数组上使用EditorFor并且编辑器模板在其中有一个窗体。
public class FooController:Controller {
public ActionResult Action(Foo foo) {
// ...
}
}
Index.cshtml
@model IEnumerable<Foo>
@Html.EditorFor(m=> m)
编辑器模板
@model Foo
@using (Html.BeginForm("action", "controller"))
{
@Html.TextBoxFor(f=> f.A)
@Html.CheckBoxFor(f=> f.B)
@Html.LabelFor(f=> f.B)
}
所以我会遇到一些问题。
复选框标签的for不能正确绑定到复选框(这与标签未接收到属性的正确名称( [0].A
而不是A
)。
我知道我可以通过在Index中的模型上进行foreach来摆脱前言,但是由于框架没有意识到同一项目存在多个并赋予它们相同的名称,因此搞砸了id和命名。
对于复选框,我只是这样手动进行。
@Html.CheckBoxFor(m => m.A, new {id= Html.NameFor(m => m.A)})
<label for="@Html.NameFor(m => m.A)">A</label>
但是,我无法解决控制器无法将项目作为单个模型接受的问题。 我什至尝试过在Action
参数中允许Foo的数组,但仅当它的第一个项目( [0]...
)被编辑(如果数组中的其他任何项目(例如[1].A
)时才起作用)控制器不知道如何解析它。 任何帮助,将不胜感激。
使模型成为具有所需属性的类。 在您的模型子文件夹中创建一个类
public class MyModel {
public IEnumerable<Foo> Foolist { get ; set;}
public string Something { get;set;}
}
您的EditorFor必须为Foolist提供一个foreach循环... MVC将尝试将您的模型从表单中放在一起,并将其返回到控制器中的POST操作。
编辑:
您可以为foo创建一个EditorTemplate。 在“视图/共享/ EditorTemplates”文件夹中,创建FooTemplate.cs
@model Foo
<div class="span6 float-left" style="margin-bottom: 6px">
@Html.TextBoxFor(m => m.A, new { style = "width:190px" })
@Html.CheckBoxFor(m => m.B, new { style = "width:40px" })
@Html.ValidationMessage("foo", null, new { @class = "help-inline" })
</div>
然后在您看来
@foreach (var myFoo in Model)
{
@EditorFor(myFoo)
}
这仍然遭受您的“模型整体传回”的要求。 不确定为什么需要单独处理这些内容。
哈哈终于解决了这个-这是我的方法。 作为背景,HTML表单在提交表单时使用name属性,但是element的标签使用Id。 因此,我只将id标签改编为具有前缀而不是name标签。
-在cshtml文件中
@{
var prefix = ViewData.TemplateInfo.HtmlFieldPrefix;
ViewData.TemplateInfo.HtmlFieldPrefix = "";
}
那么我可以通过属性的前缀指定属性的ID,同时让名称保持不变
@Html.CheckBoxFor(m => m.A,
new {id = prefix+"."+ Html.NameFor(m => m.A)})
<label for="@prefix.@Html.NameFor(m => m.A)">A!</label></div>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.