如何设置用于绑定具有继承的模型的视图和控制器方法?

时间:2014-03-07 16:53:47

标签: 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 MaxLoad { get; set; }
}

我创建汽车或卡车的视图包含一个下拉列表,您可以在其中选择汽车或卡车,并根据您的选择将正确的表单加载到带有查询的div中。

以下是我实施此方法的方法:

  • 我创建了一个包含表单的局部视图,用于创建带有模型,颜色和座位输入的汽车。
  • 另一个带有表单的局部视图,用于创建带有模型,颜色和MaxLoad输入的卡车。
  • 每个表单都提交给自己的控制器方法,即:

    [HttpPost] public ActionResult CreateCar(Car newCar) { .... }

和CreateTruck相同。

  • 我有一个createVehicle视图,其中包含下拉列表,一个带有id的空div和一些jquery代码,用于将其中一个汽车或卡车部分视图加载到div中。

现在一切正常但如果我需要更改车辆模型中的某些内容,那么我必须更改每个局部视图和每个控制器方法。

所以我要问的是,在这种情况下,我该如何实施提交模型的最佳方式?

最理想的是:

  • 我发布模型的一种控制器方法
  • 包含Vehicle属性的createVehicle视图和仅包含其自身附加属性的每个局部视图。

1 个答案:

答案 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事件中下拉,更改表单的动作。

请注意这只是一个原型/尖峰,我实际上不会这样写。