【问题标题】:Child forms collections handling子表单集合处理
【发布时间】:2012-10-22 10:09:04
【问题描述】:

如果我的 ViewModel 有一些子属性:

public class MyViewModel
{
   public MyFormViewModel Form {get;set;}
}

我为这个属性渲染了一个表单,然后我可以得到以下 ActionResult:

[HttpPost]
public ActionResult SomeAction(MyFormViewModel form)
{
   ...
}

并且 DefaultModelBinder 填充表单属性(如果 ViewModel 的属性名称等于操作参数名称)。

但是如果 MyViewModel 包含由索引呈现的IList<MyFormViewModel>,我应该如何命名操作参数:@Html.EditorFor(x => x.Forms[index])

【问题讨论】:

  • 您能描述一下它的业务情况吗?以及它在界面中的表现如何?
  • @KirillBestemyanov,例如页面上可能有一个项目列表,我想为每个项目呈现编辑表单
  • 常见的解决方案是逐个编辑和发布项目。但是如果你想把它作为列表发布,你需要阅读这个:hanselman.com/blog/…
  • @KirillBestemyanov,我实际上不需要发布列表,我希望能够发布列表的一种形式

标签: .net asp.net-mvc


【解决方案1】:

试试这个:

控制器:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var myViewModel = new MyViewModel()
            {
                Form = new MyFormViewModel {Name = "Header"},
                FormViewModels = new List<MyFormViewModel>()
                                     {
                                         new MyFormViewModel() {Name = "First"},
                                         new MyFormViewModel() {Name = "Secound"}
                                     }
            };

        return View(model: myViewModel);
    }
    [HttpPost]
    public ActionResult Index(FormCollection collection, List<MyFormViewModel> FormViewModels, MyViewModel myView)
    {
        return View();
    }

}

型号:

public class MyViewModel
{
    public MyFormViewModel Form { get; set; }
    public IList<MyFormViewModel> FormViewModels { get; set; } 
}

public class MyFormViewModel
{
    public string Name { get; set; }
}

查看:

@model MvcChat.Models.MyViewModel
@{
    ViewBag.Title = "Home Page";
}

@using(Html.BeginForm())
{
    @Html.EditorFor(model=>model.Form.Name)

    for (int i = 0; i < Model.FormViewModels.Count; i++)
    {
        @Html.EditorFor(x => x.FormViewModels[i])
    }
    <input type="submit" value="go"/>
}

结果应该是这样的(http://i.stack.imgur.com/t0Je0.png):

【讨论】:

    【解决方案2】:

    如果你

    其实不需要发名单,我希望能发一份 列表的形式

    那么就不要使用@Html.EditorFor(x =&gt; x.Forms[index])。 使用

    var element = x.Forms[index]
    @Html.EditorFor(x => element)
    

    在这种情况下,您的操作参数的名称无关紧要。

    【讨论】:

    • 问题是我应该如何调用动作参数名称(form、forms0 等)以便 DefaultModelBinder 识别它
    • 那么答案是“没有那个名字”。如果您使用 DefaultModelBinder 并且您的 GET 参数名称类似于 Forms[0].Property1 等。
    【解决方案3】:

    我从来没有做过类似的事情,但是如果可能的话(我不知道是不是),在这里你可以找到一个古老但很好的starting point。 希望有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-23
      • 2014-08-03
      相关资源
      最近更新 更多