0

我有一个如下所示的模型

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
4

1 回答 1

0

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

  1. 要填充选择列表的集合。
  2. 回发到服务器时保存所选项目值的属性。

强类型版本如下所示:

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

如果要手动指定名称,可以这样做:

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

由于用户可以选择多个选项Id,因此需要是您的选择列表值所在类型的数组。如果它们是整数,那么您需要Id像这样public int[] Id {get; set;}

提交表单时,控件仅提交其值,您的列表框不会发回足够的数据将其绑定回原始Members列表。如果由于某种原因您需要额外的信息,您将不得不使用返回的 id。

编辑以回应第一条评论:

希望我能正确理解你。

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

于 2012-10-29T15:46:50.397 回答