Asp.net 如何为使用继承绑定模型设置视图和控制器方法?
假设我有一个Vehicle类和两个子类,如下所示:Asp.net 如何为使用继承绑定模型设置视图和控制器方法?,asp.net,asp.net-mvc,asp.net-mvc-4,razor,asp.net-mvc-5,Asp.net,Asp.net Mvc,Asp.net Mvc 4,Razor,Asp.net Mvc 5,假设我有一个Vehicle类和两个子类,如下所示: public class Vehicle { public string Model { get; set; } public string Color { get; set; } } public class Car : Vehicle { public string Seats { get; set; } } public class Truck : Vehicle { public string Max
public class Vehicle
{
public string Model { get; set; }
public string Color { get; set; }
}
public class Car : Vehicle
{
public string Seats { get; set; }
}
public class Truck : Vehicle
{
public string MaxLoad { get; set; }
}
“创建汽车或卡车的我的视图”包含一个下拉列表,您可以在其中选择“汽车”或“卡车”,并根据您选择的正确表单,使用查询将其加载到div中
下面是我如何实现这一点的:
- 我创建了一个局部视图,其中包含一个表单,用于创建带有模型、颜色和座椅输入的汽车
- 另一个带有表单的局部视图,用于创建带有模型、颜色和最大负载输入的卡车
- 每个表单提交给其自己的控制器方法,即: [HttpPost] 公共行动结果CreateCar(汽车新车) { .... }
- 我有一个createVehicle视图,其中包含下拉列表、一个带有id的空div和一些jquery代码,这些代码将一个汽车或卡车部分视图加载到div中
- 我将模型发布到的一个控制器方法
- 包含车辆属性的createVehicle视图和仅包含其自身附加属性的每个局部视图
public class VehicleViewModel
{
public Vehicle Vehicle { get; set; }
public string Action { get; set; }
}
public class AddTruckModel
{
public Truck Truck { get; set; }
}
public class AddCarModel
{
public Car Car { get; set; }
}
在您所做的控制器中(非常粗略的示例):
您使用的视图如下所示:
@model VehicleViewModel
@using(html.BeginForm(Model.Action, "Vehicle", new { id="vehicleForm" }))
{
<div id="vehicle-editor">
//very hacky, I normally return json with embedded html
@Html.HiddenFor(m => m.Action)
@Html.EditorFor(m => m.Vehicle)
</div>
}
@model VehicleViewModel
@使用(html.BeginForm(Model.Action,“Vehicle”,new{id=“vehicleForm”}))
{
//非常粗糙,我通常返回带有嵌入html的json
@HiddenFor(m=>m.Action)
@Html.EditorFor(m=>m.Vehicle)
}
您会注意到,编辑器为Car而不仅仅是车辆创建html输入。你可以利用这个优势
我会将EditorFor包装在一个html元素(例如div)中,当下拉列表发生变化时,Ajax会调用拉取另一个车辆html片段的部分(比如使用jQuery)。至于回帖,我还将在下拉列表的相同javascript/jquery事件中,更改表单的操作
请注意,这只是一个原型/峰值,我实际上不会这样写。这些是视图模型还是域模型?FWIW,通常最好在视图模型后面加上
ViewModel
或VM
,这样它们显然不是实体。这是我想要的更好的多态性用法,谢谢。但是为什么要创建AddTruckModel和AddCarModel呢?为什么不直接传递Car和Truck呢?当生成Html时,它将为Html输入名称(如Vehicle.Model
)创建一个前缀,如果模型不匹配,这些名称在回发时将无法正确绑定。
@model VehicleViewModel
@using(html.BeginForm(Model.Action, "Vehicle", new { id="vehicleForm" }))
{
<div id="vehicle-editor">
//very hacky, I normally return json with embedded html
@Html.HiddenFor(m => m.Action)
@Html.EditorFor(m => m.Vehicle)
</div>
}