所有继承自BaseModel的不同模型的One View

时间:2011-07-28 13:39:34

标签: c# asp.net-mvc razor

我想为不同的模型创建一个视图,这些模型都是从同一个BaseModel继承的。 但我不知道哪种方法是正确的。

为什么我不想使用不同/强类型的视图?因为我可以说我将建造一个灯具店并且基本模型定义了一盏灯。因此,所有继承basemodel的模型都是具有相同基本属性和1,2,3特殊属性的灯。我认为为几乎相同的模型构建30-40个视图并不是必需的。

4 个答案:

答案 0 :(得分:0)

为什么不为基本模型创建强类型视图?

您可以通过在return View("myViewName", myModel);中指定其名称来调用此视图。

另一种选择是使用T4模板从模型中生成表单字段:http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-4-custom-object-templates.html

然后只需调用@Html.EditorModelFor()即可为模型生成html。

答案 1 :(得分:0)

您可以使用viewModels来处理此问题。在MVC中,viewModel是创建的类,用于(1)向视图提供强类型类,以及(2)从模型中分离视图。

在您的情况下,您可以拥有一个呈现viewModelA的viewA,并在您的控制器中从任何需要呈现该视图的模型创建viewModelA。

这篇文章很好:http://lostechies.com/jimmybogard/2009/06/30/how-we-do-mvc-view-models/

答案 2 :(得分:0)

您是否可以定义一个BaseLamp视图,它将显示您View的所有基本属性,然后创建类似于呈现BaseLamp视图然后呈现其附加字段的ExtendedLamp视图?

答案 3 :(得分:0)

如你所说,所有的灯都是相同的,除了很少的附加属性。想象一下,属性是基类的扩展。基类允许存在扩展(通过LampSpecialProperties),但不关心它们的内容。然后你可以定义像这样的模型

public class LampViewModel
{
   public string SomeProperty {get;set}
   public LampSpecialProperties SpecialProperties {get;set;}
}

public abstract class LampSpecialProperties
{ }

public class SomeConcreteLampSpecialProperties : LampSpecialProperties
{
     public string BrightnessLevel {get;set;}
}

在您的视图中,显示灯泡基本型号属性,然后显示扩展属性

@model LampViewModel
... some shared properties    
@Html.DisplayFor(model => model.SpecialProperties)

在Views / DisplayTemplates中,您可以为这些LampSpecialProperties的每个具体实现提供模板

@model SomeConcreteLampSpecialProperties
@Html.DisplayFor(model => model.BrightnessLevel)

另一盏灯

@model SomeAnotherConcreteLampSpecialProperties
@Html.DisplayFor(model => model.FuelConsumption)// sounds scarry :)

所有灯泡扩展等等。

但这一切都与您的域名和业务逻辑有关。如果您的企业无论如何都需要30-40个模型类,您应该逐个创建它们