1

単一の型から継承する型のジェネリック コレクションを含むプロパティを持つ 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 を使用してポストバックするにはどうすればよいでしょうか?

4

1 に答える 1

2

DefaultModelBinder ではそれを行うことはできません。やりたいことを実行するには、独自のカスタム モデル バインダーを作成する必要があります。

これらは役立つかもしれません:

https://gist.github.com/joelpurra/2415633

サブクラスへの ASP.NET MVC3 バインド

ASP.NET MVC 3: 継承/ポリモーフィズムを備えた DefaultModelBinder

于 2013-07-16T01:27:29.493 に答える