具有包含复杂成员的列表属性的MVC视图模型

时间:2012-10-29 15:34:19

标签: asp.net-mvc mvc-editor-templates defaultmodelbinder

我的模型类似于以下

class ContainerClass
{
    string Name { get; set;}
    Guid Id { get; set; }

    [UIHint("CustomSelectBox")]
    List<Member> Members { get; set; }
}

class Member
{
    string Name { get; set;}
    Guid Id { get; set; }
    string SomeProperty { get; set;}
}

class DerivedFromMember: Member
{
   string AnotherProperty { get; set;}
}

如果控制器操作是

    [HttpPost]
    public ActionResult Edit(ContainerClassmodel)
    {
         return null;
    } 

任何人都可以说明为什么默认模型绑定器无法映射列表中的列表成员,即

<select id="Members" name="Members" multiple="multiple" >
 <option id="Members[0].Id" selected="selected" name="Members[0].Id" value="9b1ea01c-6dad-470d-a6c1-a0f5009ac069">Member One</option>
<option id="Members[1].Id" selected="selected" name="Members[1].Id" value="adf1dbda-9020-45b7-abd7-a0f5009a9b30">Member two</option>
</select>

请注意,所有值都已选中。

而以下工作

 <input type="hidden" name="Members[0].Id" value="9b1ea01c-6dad-470d-a6c1-a0f5009ac069" />
 <input type="hidden" name="Members[1].Id" value="adf1dbda-9020-45b7-abd7-a0f5009a9b30" />

老实说,我知道它为什么不起作用:(因为如果我查看http标题,选择提交的数据对于默认的模型绑定器是不够的。

Members:9b1ea01c-6dad-470d-a6c1-a0f5009ac069
Members:adf1dbda-9020-45b7-abd7-a0f5009a9b30

任何人都可以告诉标签内部有什么变化,以便提交数据

Members[0].Id:9b1ea01c-6dad-470d-a6c1-a0f5009ac069
Members[1].Id:adf1dbda-9020-45b7-abd7-a0f5009a9b30

1 个答案:

答案 0 :(得分:0)

使用选择列表时,模型中需要两件事。

  1. 用于填充选择列表的集合。
  2. 在回发到服务器时保存所选项目值的属性。
  3. 强类型版本如下所示:

    @Html.ListBoxFor(x=> x.Id, IEnumerable<SelectListItem>)
    

    如果要手动指定名称,可以执行以下操作:

    @Html.ListBox("Id", IEnumerable<SelectListItem>)
    

    由于用户可以选择多个选项Id需要是您的选择列表值所在类型的数组。如果它们是整数,那么您需要Id如下:{{1 }}

    提交表单时,控件只提交其值,您的列表框不会发回足够数据以将其绑定回原始public int[] Id {get; set;}列表。如果由于某种原因你需要额外的信息,你将不得不采取回来的身份。

    根据第一条评论进行修改:

    希望我能正确理解你。

    如果要通过AJAX查询该选择框的更多选项,可以将AJAX端点设置为另一个返回JSON的操作。您真正需要发回的只是一组键/值对(用于选项值和文本)。然后使用JavaScript将选项附加到原始列表框。如果您要询问序列化Members,请确定是否会正确序列化。