【问题标题】:ASP.NET MVC Generic List of Different SubClasses不同子类的 ASP.NET MVC 通用列表
【发布时间】:2013-07-16 00:44:05
【问题描述】:

我有一个 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 一起回传?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-4


    【解决方案1】:

    使用 DefaultModelBinder 无法做到这一点。您必须创建自己的自定义模型绑定器才能执行您想做的事情。

    这些可能会有所帮助:

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

    ASP.NET MVC3 bind to subclass

    ASP.NET MVC 3: DefaultModelBinder with inheritance/polymorphism

    【讨论】:

    • 感谢阿塔拉瓦蒂。我会调查的。
    猜你喜欢
    • 1970-01-01
    • 2012-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多