繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM