単一の型から継承する型のジェネリック コレクションを含むプロパティを持つ MVC モデルがあります。期待どおりにエディターが表示されますが、ポストバックすると、すべてのアイテムのタイプが基本タイプになります。正しい型を返すにはどうすればよいですか?
モデル...
public class PageEM {
public long Id { get; set; }
public virtual IList<FieldEM> Fields { get; set; }
}
public class FieldEM { // I'd really like this to be abstract.
public long Id { get; set; }
public string Caption { get; set; }
public string Value { get; set; }
}
public class TextFieldEM : FieldEM {
}
public class CheckBoxFieldEM : FieldEM {
public bool ValueData {
get { return (bool)Value; }
set { Value = (string)value; }
}
PageEM ビュー...
@model PageEM
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>Fields</legend>
@Html.HiddenFor(m => m.Id)
@Html.EditorFor(m => m.Fields)
<input type="submit" value="Submit" title="Submit" />
</fieldset>
}
TextFieldEM エディタ...
@model TextFieldEM
<div>
@Html.HiddenForFor(m => m.Id)
<div>
@Html.LabelFor(m => m.Value, Model.Caption)
</div>
<div class="editor-field">
@Html.TextBoxFor(m => m.Value)
@Html.ValidationMessageFor(m => m.Value)
</div>
</div>
CheckBoxFieldEM エディタ...
@model CheckBoxFieldEM
<div>
@Html.HiddenForFor(m => m.Id)
<div class="editor-field">
@Html.EditorFor(m => m.DataValue)@Html.LabelFor(m => m.DataValue, Model.Caption, new { @class = "checkbox" })
</div>
</div>
コントローラ...
public partial class PageController : Controller {
public virtual ActionResult Edit() {
PageEM em = new PageEM() {
Id = 123,
Fields = new List<FieldEM>() {
new TextFieldEM() { Id = 1, Caption = "Text Line", Value = "This is test" },
new CheckBoxEM() { Id = 2, Caption = "Check here", ValueData = true }
}
};
return View(em);
}
[HttpPost]
public virtual ActionResult Edit(PageEM em) {
if (!ModelState.IsValid)
return View(em);
// but all of the em.Fields are FieldEM.
}
}
では、サブクラス化された FieldEM を使用してポストバックするにはどうすればよいでしょうか?