大家好我有一个名为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)
{
}
在回发表单时,将这些值自动终结的最佳方法是什么?
创建自定义活页夹类是我唯一的选择吗?有人可以提供一些示例代码来说明如何执行此操作吗?任何帮助非常感谢。
答案 0 :(得分:6)
您必须使用自定义模型绑定器。默认模型绑定器不知道要实例化的具体类型。您可以在每行中包含一个隐藏字段,指示您的自定义模型绑定器将创建的具体类型。我有shown this in action here
。顺便提一下,通过使用标准模板命名约定,您可以摆脱正在使用的for
循环以及VehicleConstants.GetTemplateName
方法。