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

时间:2012-05-04 21:54:43

标签: asp.net-mvc class binding 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; }
}

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

public class Page
{
    public List<Vehicle> vehicles { get; set; }
}

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

    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>
 }

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

此模板只是在汽车类或Jeep类(派生类+基类)

上写入属性

我遇到的问题是当回发表单时我只能在我的控制器中访问Base类Vehicle的属性我无法获得子类car或Jeep属性的值。

        [HttpPost]
    public string ReadPost(Page page)
    {
    }

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

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

1 个答案:

答案 0 :(得分:6)

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