ASP.NET MVC 3.0与Base和Derived类的模型绑定?

ico*_*guy 6 asp.net-mvc binding class derived

大家好我有一个名为Vehicle的基类,我拥有所有车辆共有的所有属性,我有多个派生类,称为Car,Jeep,派生自Vehicle并添加更多属性

例如:

    public class Vehicle
{
    public int Color { get; set; }
    public double Cost { get; set; }
}


public class Car : Vehicle
{
    public SelectListItem Option { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我有一个Page类,其中有一个像这样的车辆列表

public class Page
{
    public List<Vehicle> vehicles { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我的视图是Page类的强类型,因此在我看来,我循环遍历所有车辆以显示在页面上,这样的代码在@using(Html.BeginForm())里面,所以我们回发用户选择

    for(int i=0;i<Model.Vehicles.Count;i++)
{
    <div id="Question">
        @{
            @Html.EditorFor(m => m.Vehicle[i], VehicleConstants.GetTemplateName(Model.Questions[i]));
         }
    <br />
    </div>
 }
Run Code Online (Sandbox Code Playgroud)

我为每种类型的车辆使用一个编辑器模板,因此函数调用VehicleConstants.GetTemplateName只返回要根据车辆类型使用的模板的名称

此模板只是在汽车类或Jeep类(派生类+基类)上写入属性

我遇到的问题是当表单被回发时我只能访问我的控制器中的基类车辆的属性我无法获得子类汽车或吉普车的属性值.

        [HttpPost]
    public string ReadPost(Page page)
    {
    }
Run Code Online (Sandbox Code Playgroud)

回传表单时,将这些值自动终结的最佳方法是什么?

创建自定义活页夹类是我唯一的选择吗?有人可以提供一些示例代码来说明如何执行此操作吗?任何帮助非常感谢.

Dar*_*rov 7

您必须为此使用自定义模型绑定器.默认模型绑定器不知道要实例化的具体类型.您可以在每行中包含一个隐藏字段,指示自定义模型绑定器将创建的具体类型.我有shown this in action here.顺便提一下,通过使用标准模板命名约定,您可以摆脱for您正在使用的循环以及VehicleConstants.GetTemplateName方法.