我想为不同的模型创建一个视图,这些模型都是从同一个BaseModel继承的。 但我不知道哪种方法是正确的。
为什么我不想使用不同/强类型的视图?因为我可以说我将建造一个灯具店并且基本模型定义了一盏灯。因此,所有继承basemodel的模型都是具有相同基本属性和1,2,3特殊属性的灯。我认为为几乎相同的模型构建30-40个视图并不是必需的。
答案 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个模型类,您应该逐个创建它们