一个视图用于所有从BaseModel继承的不同模型

本文关键字:继承 BaseModel 模型 一个 用于 视图 | 更新日期: 2023-09-27 18:04:03

我想为所有继承自同一BaseModel的不同模型创建一个视图。但我不知道哪一种方法是正确的。

为什么我不想使用不同/强类型的视图?因为假设我要建一个灯铺,基础模型定义了一盏灯。所以所有继承basemodel的模型都是具有相同basemodel属性和1,2,3个特殊属性的灯。我认为没有必要为几乎相同的模型构建30-40个视图。

一个视图用于所有从BaseModel继承的不同模型

正如你所说的,除了一些额外的属性外,所有的灯都是一样的。把属性想象成基类的扩展。基类允许存在扩展(通过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个模型类,你应该一个一个地创建它们

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

您可以通过在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。

你可以使用viewModels来处理这个问题。在MVC中,viewmodel是用来(1)为视图提供强类型类和(2)从模型中分离视图的类。

在你的例子中,你可以有一个呈现viewModelA的viewA,并在你的控制器中从任何需要呈现该视图的模型创建viewModelA。

这是一篇关于这个主题的好文章:http://lostechies.com/jimmybogard/2009/06/30/how-we-do-mvc-view-models/

你可以定义一个BaseLamp视图,它将显示你的视图的所有基本属性,然后创建一个像ExtendedLamp视图渲染BaseLamp视图,然后它的附加字段?