次のようなモデルがあります
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" />
正直に言うと、それが機能しない理由はわかっています:(なぜなら、selectの場合に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