什么是模型绑定复杂嵌套类型的良好HTML命名约定?

时间:2010-09-13 11:05:55

标签: c# asp.net-mvc rest viewmodel model-binding

如果我有一个由嵌套复杂类型组成的对象,例如具有List<Fu>List<Bar>

的ViewModel
public class WarViewModel
{
    List<Fu> Fu { get; set; }
    List<Bar> Bar { get; set; }
}

public class Fu
{
    public int Id {get;set;}
    public Soldier Private { get; set; }
}

public class Bar
{
    public int Id {get;set;}        
    public Soldier Private { get; set; }
}

public class Soldier
{
    public int Id {get;set;}
    public string Name { get; set; }
    public int Age { get; set; }
}

如果我的form包含2个select列表,可以使用Fu或Bar,其中每个option代表列表中的每个士兵,并且该选项包含属性Id,姓名和年龄,例如

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<WarViewModel>" %>

<% using (Html.BeginForm("WarAction", "War")) { %>        
    <% foreach (var soldier in Fu) %>
        <select class="fu">
            <option id='<%= soldier.Id %>' age='<%= soldier.Age %>'><%= soldier.Name %></option>
        </select>
    <% } %>

    <% foreach (var soldier in Bar) %>
        <select class="bar">
            <option id='<%= soldier.Id %>' age='<%= soldier.Age %>'><%= soldier.Name %></option>
        </select>
    <% } %>        
<% } %>

我需要使用哪种命名约定,以便在提交表单时,将使用在两个列表中选择的士兵填充以下操作方法的WarViewModel?

public ActionResult WarAction(WarViewModel war)
{
    return View();
}

我现在的理解是模型绑定器不会知道士兵是哪个,所以它不知道哪个Id与哪个士兵相关联。我有办法解决这个问题吗?我知道上面的代码不会验证,但我正在尝试为自己实现一个概念验证。

此外,需要更改什么才能使这种方法成为RESTful?

1 个答案:

答案 0 :(得分:1)

您已尝试做的事情已得到支持:

http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx