Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 如何为使用继承绑定模型设置视图和控制器方法?_Asp.net_Asp.net Mvc_Asp.net Mvc 4_Razor_Asp.net Mvc 5 - Fatal编程技术网

Asp.net 如何为使用继承绑定模型设置视图和控制器方法?

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

假设我有一个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] 公共行动结果CreateCar(汽车新车) { .... }

CreateTruck也一样

  • 我有一个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>
}