ASP.NET MVC动态视图

时间:2011-02-01 05:52:57

标签: asp.net-mvc model-binding model-validation

我几天前发布了这个问题的背景信息..但答案还不完整,所以重新发布了摘要。

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

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

在“多步”向导过程中,最后一步允许用户输入类别特定的详细信息(车辆的型号,制造,VIN等)。视图页面绑定到“AssetView”模型,该模型定义如下

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

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

    public SpecificAsset AssetDetails { get; set; }
}

AssetDetails属性将在运行时根据前一阶段选择的类别类型动态更改。视图看起来像这样

@model AssetView
....
<div class="wizard-step">
  ...
 </div>
<div class="wizard-step">
  ...
 </div>
<div class="wizard-step">
  @Html.EditorFor(model => model.AssetDetails)
 </div>

在控制器中,基于类别选择。我初始化assetdetails如下

_thisAsset.AssetDetails = new MotorAsset();

然后我使用特定于类型的编辑器模板覆盖视图。

向导工作正常,但在控制器的“保存”步骤中,“AssetDetails”属性没有值,并且显示为“SpecificAsset”类型,它是基本类型。我也无法将其转换为特定类型。但是,formsCollection显示所有值,“AssetDetails”特定属性(如“Transmission”,“Make”)位于前缀为“AssetDetails_”的表单集合中。

请记住,我需要在控制器保存步骤中处理超过20种特定类别(电机,房屋等),如何在没有某种黑客的情况下执行此操作?

2 个答案:

答案 0 :(得分:0)

如果你知道AssetDetails的类型,你可以这样做:

  1. 将AssetView作为参数 行动(绑定共同点 属性)
  2. 创建一个新的实例 特定的AssetDetails(例如 CarDetails)
  3. 使用其中一个重载 TryUpdateModel绑定值。 有一些重载让 你指定前缀所以它应该 永远的工作
  4. 将此对象添加到 AssetView.SpecificAsset
  5. 您需要一些方法来了解具体类型。但是我想你会有一个跟踪类型的变量,所以你可以在以后适当地保存它。如果你不这样做很容易添加。请记住,它需要是AssetView,因为AssetDetails不受约束。

    如果您需要验证,还可以尝试使用TryValidateModel。

答案 1 :(得分:0)

据我了解,模型数量会增加,您希望重复使用所有模型的操作和视图。我看到的一个选项是制作自定义的ModelBinder。您将检查FormCollection,而不是创建特定的资产模型。

您的解决方案的问题是,SpecificAsset没有属性,因此默认模型绑定器不会将任何字段绑定到它。