使用EditorFor(model [])时传回单个对象

时间:2016-09-07 15:17:16

标签: c# asp.net-mvc editorfor

这在我身边已经有一段时间了。如果我在一个对象数组上使用EditorFor,而编辑器模板中有一个表格,例如

public class FooController:Controller {

    public ActionResult Action(Foo foo) {
        // ...
    }
}

Index.cshtml

@model IEnumerable<Foo>
@Html.EditorFor(m=> m)

EditorTemplate

@model Foo
@using (Html.BeginForm("action", "controller"))
{
    @Html.TextBoxFor(f=> f.A)
    @Html.CheckBoxFor(f=> f.B)
    @Html.LabelFor(f=> f.B)
}

所以我会遇到一些问题。

没有正确绑定到复选框的复选框标签(这与标签没有收到属性的正确名称([0].A而不是A有关) })。

我知道我可以通过对索引中的模型做一个foreach来摆脱前置文本但是因为框架没有意识到有相同项目的多个并且给它们同名。

对于复选框,我只是手动这样做。

@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)控制器不知道如何解析它。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

使您的模型成为具有所需属性的类。 在Models子文件夹中创建一个类

public class MyModel { 
public IEnumerable<Foo> Foolist { get ; set;} 
public string Something { get;set;}
}

你的EditorFor必须有一个for Foolist的foreach循环...... MVC将尝试从表单中将您的模型放在一起,并将其返回到控制器中的POST操作。

编辑:

你可以为foo创建一个EditorTemplate。在Views / Shared / 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)
    }

这仍然会受到“模型整体传回”的要求。不确定为什么需要单独处理这些。

答案 1 :(得分:0)

哈哈终于解决了这个问题 - 这就是我的表现。作为一些背景HTML表单在提交表单时使用name属性,但元素的标签使用Id。所以我只调整id标签以获得前缀而不是名称标签。

- 在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>