Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.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 mvc 3 ASP.NET MVC 3-将模型绑定到列表<&燃气轮机;包含不同类型的_Asp.net Mvc 3 - Fatal编程技术网

Asp.net mvc 3 ASP.NET MVC 3-将模型绑定到列表<&燃气轮机;包含不同类型的

Asp.net mvc 3 ASP.NET MVC 3-将模型绑定到列表<&燃气轮机;包含不同类型的,asp.net-mvc-3,Asp.net Mvc 3,我正在尝试解决如何将包含多个对象类型列表的模型绑定到ASP.NET MVC 3中的回发操作。我有以下定义列表a车辆类型的类: public enum VehicleType { Car, Plane. Boat } public class BaseVehicle { public VehicleType VehicleType { get; set; } public string Name { get; set; } public int P

我正在尝试解决如何将包含多个对象类型列表的模型绑定到ASP.NET MVC 3中的回发操作。我有以下定义列表a车辆类型的类:

public enum VehicleType
{
    Car,
    Plane.
    Boat
}

public class BaseVehicle
{
    public VehicleType VehicleType { get; set; }
    public string Name { get; set; }
    public int Passengers { get; set; }
}

public class Plane : BaseVehicle
{
    public int WingSpan { get; set; }
    // -- etc --
}

// Properties omitted
public class Car : BaseVehicle {}
public class Boat : BaseVehicle {}

public class VehiclesViewModel
{
    public string Notes { get; set; }
    public List<BaseVehicle> Vehicles { get; set; }
}
公共枚举车辆类型
{
汽车
飞机
船
}
公共级基本车辆
{
公共车辆类型车辆类型{get;set;}
公共字符串名称{get;set;}
公共int乘客{get;set;}
}
公共级飞机:基地飞行器
{
公共int翼展{get;set;}
//等等--
}
//省略属性
公共级车辆:基本车辆{}
公营船只:基本车辆{}
公共类车辆视图模型
{
公共字符串注释{get;set;}
公共列表车辆{get;set;}
}
以上类别通过以下视图显示:

<!-- VehiclesView.cshtml - loaded by the controller -->
@model Mvc3Test.Models.VehiclesViewModel
<h2>Vehicles</h2>
@Html.EditorFor(m => m.Notes)
<hr />
@Html.EditorFor(m => m.Vehicles)

<!-- BaseVehicle.cshtml -->
@model BaseVehicle
@using Mvc3Test.Data
@Html.HiddenFor(m => m.VehicleType)
@{
    if (Model.VehicleType == VehicleType.Car)
    {
        Html.RenderPartial("Car", (Car)Model);
    }
    else if (Model.VehicleType == VehicleType.Plane)
    {
        Html.RenderPartial("Plane", (Plane)Model);
    }
    // etc..
}

<-- Plane.cshtml -->
@model Mvc3Test.Data.Plane
<h2>Plane</h2>
<p>Name: @Html.EditorFor(m => m.Name)</p>
<p>Passengers: @Html.EditorFor(m => m.Passengers)</p>
<p>Wingspan: @Html.EditorFor(m => m.WingSpan) metres</p>

<!-- Car.cshtml omitted -->

@Mvc3Test.Models.Vehicles视图模型
车辆
@EditorFor(m=>m.Notes)

@Html.EditorFor(m=>m.Vehicles) @模型基准车 @使用Mvc3Test.Data @Html.HiddenFor(m=>m.VehicleType) @{ 如果(Model.VehicleType==VehicleType.Car) { Html.RenderPartial(“汽车”,“汽车”模型); } 否则如果(Model.VehicleType==VehicleType.Plane) { 渲染部分(“平面”,“平面”模型); } //等等。。 } @Mvc3Test.Data.Plane型号 飞机 名称:@Html.EditorFor(m=>m.Name)

乘客:@Html.EditorFor(m=>m.patients)

翼展:@Html.EditorFor(m=>m.Wingspan)米

我不知道上面提到的是处理显示(尤其是视图中的if语句)的最佳方法,但它现在可以工作了。问题是如何绑定回viewmodel类。我已经尝试用Html.TextBox()替换Html.TextBorFor(),这样我就可以添加绑定前缀(“Vehicles.Car”等),但是似乎没有一种方法可以让默认的模型绑定器来确定Html中表示的是什么类型的类,从而可以实例化正确的类型

我想我必须编写一个定制的模型绑定器来解决这个问题——这是正确的方法还是我错过了另一种方法

首先感谢您的帮助

if (Model.VehicleType == VehicleType.Car) { Html.RenderPartial("Car", (Car)Model); } else if (Model.VehicleType == VehicleType.Plane) { Html.RenderPartial("Plane", (Plane)Model); } 如果(Model.VehicleType==VehicleType.Car) { Html.RenderPartial(“汽车”,“汽车”模型); } 否则如果(Model.VehicleType==VehicleType.Plane) { 渲染部分(“平面”,“平面”模型); } 可以用EditorFor省略。效果很好

至于绑定回-IMO最好的方法是创建自定义模型绑定器

例如:

public class DerivedTypeModelBinder : DefaultModelBinder { public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { var typeName = GetVehicleType(bindingContext); if (typeName != null) { var modelType = Type.GetType(typeName); var targetTypeInstance = Activator.CreateInstance(modelType); bindingContext = new ModelBindingContext { ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(() => targetTypeInstance, modelType), ModelState = bindingContext.ModelState, FallbackToEmptyPrefix = bindingContext.FallbackToEmptyPrefix, ModelName = bindingContext.FallbackToEmptyPrefix ? string.Empty : bindingContext.ModelName, ValueProvider = bindingContext.ValueProvider, }; } return base.BindModel(controllerContext, bindingContext); } private string GetVehicleType(ModelBindingContext bindingContext) { var valueResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName + "." + "VehicleType"); if (valueResult == null && bindingContext.FallbackToEmptyPrefix) { valueResult = bindingContext.ValueProvider.GetValue("VehicleType"); } return valueResult == null ? null : valueResult.AttemptedValue; } } 公共类DerivedTypeModelBinder:DefaultModelBinder { 公共重写对象BindModel(ControllerContext ControllerContext,ModelBindingContext bindingContext) { var typeName=GetVehicleType(bindingContext); if(typeName!=null) { var modelType=Type.GetType(typeName); var targetTypeInstance=Activator.CreateInstance(modelType); bindingContext=新模型bindingContext { ModelMetadata=ModelMetadataProviders.Current.GetMetadataForType(()=>targetTypeInstance,modelType), ModelState=bindingContext.ModelState, FallbackToEmptyPrefix=bindingContext.FallbackToEmptyPrefix, ModelName=bindingContext.FallbackToEmptyPrefix?字符串。空:bindingContext.ModelName, ValueProvider=bindingContext.ValueProvider, }; } 返回base.BindModel(controllerContext、bindingContext); } 私有字符串GetVehicleType(ModelBindingContext bindingContext) { var valueResult=bindingContext.ValueProvider.GetValue(bindingContext.ModelName+“+”+“VehicleType”); if(valueResult==null&&bindingContext.FallbackToEmptyPrefix) { valueResult=bindingContext.ValueProvider.GetValue(“车辆类型”); } 返回值result==null?null:valueResult.AttemptedValue; } }
我想应该能帮到你。@AFinkelstein对我来说听起来像是个复制品。是的-是个复制品-对不起-我没有遇到另一个问题。。