6

大家好,我有一个名为 Vehicle 的基类,其中包含所有车辆共有的所有属性,并且我有多个名为 Car、Jeep 的派生类,它们派生自 Vehicle 并添加更多属性

前任:

    public class Vehicle
{
    public int Color { get; set; }
    public double Cost { get; set; }
}


public class Car : Vehicle
{
    public SelectListItem Option { get; set; }
}

我有一个 Page 类,其中有一个像这样的车辆列表

public class Page
{
    public List<Vehicle> vehicles { get; set; }
}

我的视图是 Page 类的强类型,所以在我看来,我正在循环所有车辆以显示在这样的页面上,此代码在 @using(Html.BeginForm()) 内部,因此我们回发用户选择

    for(int i=0;i<Model.Vehicles.Count;i++)
{
    <div id="Question">
        @{
            @Html.EditorFor(m => m.Vehicle[i], VehicleConstants.GetTemplateName(Model.Questions[i]));
         }
    <br />
    </div>
 }

我为每种类型的车辆使用一个编辑器模板,因此调用 VehicleConstants.GetTemplateName 的函数仅根据车辆类型返回要使用的模板名称

这个模板只是简单的在car类或者Jeep类上写属性(Derived class + Base class)

我遇到的问题是,当表单被发回时,我只能访问控制器中基类车辆的属性,我无法获得子类汽车或吉普车的属性值。

        [HttpPost]
    public string ReadPost(Page page)
    {
    }

回发表单时自动绑定这些值的最佳方法是什么?

创建自定义活页夹类是我唯一的选择吗?有人可以为我提供一些示例代码来说明如何执行此操作吗?非常感谢任何帮助。

4

1 回答 1

7

为此,您将不得不使用自定义模型绑定器。默认模型绑定器不知道要实例化哪种具体类型。您可以在每一行中包含一个隐藏字段,指示您的自定义模型绑定器将创建的具体类型。我有shown this in action here。顺便注意,通过使用标准模板命名约定,您可以摆脱for正在使用的循环以及VehicleConstants.GetTemplateName方法。

于 2012-07-13T06:26:12.303 回答