大家好,我有一个名为 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; }
}
我的 View 是 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>
}
我为每种类型的车辆使用一个编辑器模板,因此调用 VehicleConstants.GetTemplateName 的函数仅返回要根据车辆类型使用的模板名称
这个模板只是简单的在car类或者Jeep类上写属性(Derived class + Base class)
我遇到的问题是,当表单被发回时,我只能访问 Controller 中基类车辆的属性,我无法获得子类汽车或吉普车的属性值。
[HttpPost]
public string ReadPost(Page page)
{
}
回发表单时自动绑定(bind)这些值的最佳方法是什么?
创建自定义活页夹类是我唯一的选择吗?有人可以为我提供一些示例代码来说明如何执行此操作吗?非常感谢任何帮助。
最佳答案
为此,您将不得不使用自定义模型绑定(bind)器。默认模型绑定(bind)器不知道要实例化哪种具体类型。您可以在每一行中包含一个隐藏字段,指示您的自定义模型绑定(bind)器将创建的具体类型。我有 shown this in action here
.顺便注意一下,通过使用标准模板命名约定,您可以摆脱 for
您正在使用的循环以及 VehicleConstants.GetTemplateName
方法。
关于asp.net-mvc - ASP.NET MVC 3.0 模型与基类和派生类绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10456614/