2016-09-07 15 views
0

这一直在我身边刺了一阵子。如果我在对象数组上使用EditorFor,并且编辑器模板中有一个表单。使用EditorFor(模型[])传回单个对象

public class FooController:Controller{ 

    pubic ActionResult Action(Foo foo){ 
    blah... 
    } 
} 

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来删除前期文本,但是由于框架没有意识到同一个项目有多个并且给它们起了相同的名称,所以将id和screw命名为空白。我刚才一直在这样做。

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

+0

如何使一个复杂的模型? –

+0

@MarcLyon你的意思是将IEnumerable包装在父类中吗?因为这打破了每个单独项目包装的整体目的 –

+0

我不完全确定你的描述,但它可能是http://stackoverflow.com/q/25333332/11683 – GSerg

回答

0

使您的模型成为您需要的属性的一个类。在你的模型子 创建一个类

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) 
    } 

这仍然从“模型被传递回为一个整体”你的requiredment受到影响。不知道为什么需要单独处理这些问题。

+0

谢谢,但这正是我想要避免的我不想发回IEnumerable中每一行的所有数据我想发回一个特定的项目 –

+0

然后您将需要利用JavaScript和AJAX向您的控制器发回原子请求以进行更新或您正在做的任何事情。 如果您在您的模型中使用IEnumerable,则MVC将排列这些值,当它返回该模型时,它会为您提供A. [0]索引你试图避免。处理整个模型的问题是什么? –

+0

谢谢我知道ajax和JS选项,但我试图t o没有他们解决这个特殊问题。在给定的情况下,如果Action是模型的编辑,那么您不希望记录每个对象都已编辑(如果您在模型上有审核日期),只是因为您更新了数千项中的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="@[email protected](m => m.A)">A!</label></div> 
相关问题