1

我正在开发一个 MVC 3 Razor Web 应用程序,其中存储了多个对象类别的详细信息。(车辆、房屋、仪器等)。所有对象共享一些公共数据(标题、描述等)和一些特定于其所属类别的详细信息。Category 列表预计会增长,并且考虑到降低可维护性,我们希望重用相同的 Add Object 向导。该向导基于以下实现。

http://afana.me/post/create-wizard-in-aspnet-mvc-3.aspx

在多步骤向导过程中,最后一步允许用户输入特定类别的详细信息(车辆的型号、品牌、VIN 等)。目前我已经将这最后一步设想为使用 AJAX 的部分视图。因此,我们实际上将拥有多个反映特定类别的部分视图,但共享向导代码的其余部分。

我的通用模型对象是这样的

public class AssetView
{
    [Required]      
    public string Title
     {
        get;
        set;
     }

    [Required]
    public string Description
    {
     get;
      set;
     }

    // Few more generic fields here

    public SpecificAsset AssetDetails { get; set; }
}

复杂属性 AssetDetails 由每种类型的局部视图表示。因此,PartialView“MotorDetails”将包含一个 MotorAsset 类型的强类型模型,声明如下。

  public class MotorAsset : SpecificAsset
    {
        [Required]
        public string Transmission
        {
            get;
            set;
        }

        [Required]
        public string Make
        {
            get;
            set;
        }
     }

实际验证要复杂得多,但我省略了这些以便更容易理解。

主向导页面声明为

    @model AssetView

  .....

  <div class="wizard-step">
     ....
  </div>
  <div class="wizard-step">
     ....
  </div>
  <div class="wizard-step">
      @{Html.RenderPartial("_MotorCreate", Model.AssetDetails);
  </div>

电机部分视图为

 @model MotorAsset

我的问题是如何在这种情况下完成模型验证(或者是否可以使用),因为最后一步不是在视图页面中,而是在部分视图中。

4

1 回答 1

0

为什么不求助于简单的类继承(OOP 范式)而不是在 AssetView 上拥有一个属性 AssetDetails?

而不是你现在拥有的,你应该声明

AssetView(通用属性)-> MotorView 继承 AssetView(特定属性)

像这样:

public class AssetView {     
    [Required]           
    public string Title { get; set; }

    [Required]
    public string Description     { get; set; }      

    // Few more generic fields here
}

public class MotorView : AssetView {
    ...
}

@model MotorView    // you still have access to the AssetView's properties in your view and in your controller actions

如果您想保留现在的方式,请使用EditorFor()并在共享文件夹中创建一个EditorFor模板并将其强输入MotorAsset(或者SpecificAsset,如果您希望它更通用)。

然后像这样渲染出来:

@Html.EditorFor(model=>model.AssetDetails)

这将使控制器能够验证它并将其自动绑定到您的AssetView. 高温高压

于 2011-01-29T16:40:47.867 回答