假设我有一个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 MaxLoad { get; set; }
}
我创建汽车或卡车的视图包含一个下拉列表,您可以在其中选择汽车或卡车,并根据您的选择将正确的表单加载到带有查询的div中。
以下是我实施此方法的方法:
每个表单都提交给自己的控制器方法,即:
[HttpPost] public ActionResult CreateCar(Car newCar) { .... }
和CreateTruck相同。
现在一切正常但如果我需要更改车辆模型中的某些内容,那么我必须更改每个局部视图和每个控制器方法。
所以我要问的是,在这种情况下,我该如何实施提交模型的最佳方式?
最理想的是:
答案 0 :(得分:0)
如果您有像以下的ViewModel:
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; }
}
在你做的控制器中(严重粗略的例子):
public ActionResult(int? vehicleType)
{
var model = new VehicleViewModel;
if (!vehicleType.hasValue || vehicleType.Value == 1)
{
model.Vehicle = new Car();
model.Action = "AddCar";
}
else
{
model.Vehicle = new Truck()
model.Action = "AddTruck";
}
if (Request.IsAjaxRequest())
{
return Partial(model);
}
return View(model);
}
public ActionResult AddCar(AddCarModel model)
{
}
public ActionResult AddTruck(AddTruckModel 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>
}
你会注意到编辑器为Car而不仅仅是Vehicle创建了html输入。你可以利用这个优势。
我将在一个html元素(例如div)中包装EditorFor,当下拉列表发生变化时,Ajax会调用另一个车辆html片段(比如使用jQuery)。至于回帖,我也会在同一个javascript / jquery事件中下拉,更改表单的动作。
请注意这只是一个原型/尖峰,我实际上不会这样写。