我正在开发一个ASP.Net MVC网站。
我有一个名为animal的表,它首先使用Entity Framework代码基于此类创建:
public class Animal
{
public int AnimalId { get; set; }
public string AnimalName { get; set; }
public int NoOfLegs { get; set; }
public int FlyingSpeed { get; set; }
public int RunningSpeed { get; set; }
}
现在我的AnimalRepository从数据库读取此信息并将其传递给我的ViewModel(My Domain Classes与我的ViewModel不同,我使用ModelReader,ModelWriter和AutoMapper将我的域模型映射到我的视图模型{{ 3}})。我在ViewModel中有这个通用接口:
public interface IAnimalModel
{
int AnimalId { get; set; }
string AnimalName { get; set; }
int NoOfLegs { get; set; }
}
我在ViewModel中有这两个类:
public class DogModel: IAnimalModel
{
public int AnimalId { get; set; }
public string AnimalName { get; set; }
public NoOfLegs { get; set; }
public int RunningSpeed { get; set; }
}
public class EagleModel: IAnimalModel
{
public int AnimalId { get; set; }
public string AnimalName { get; set; }
public NoOfLegs { get; set; }
public int FlyingSpeed { get; set; }
}
现在我有一个Animal Controller使用AnimalRepositoy从DB获取数据,并将其映射到正确的ViewModel。
我想将我的View绑定到IAnimalModel接口,以便我可以将不同的动物传递给同一个View。
在我的视图中,我想使用Razor Code来显示基于Animal Model类型的某些属性,如下所示:
@if (typeof(Model) == typeof(EagleModel)) {
Html.EditorFor(model => model.FlyingSpeed)
}
@if (typeof(Model) == typeof(DogModel)) {
Html.EditorFor(model => model.RunningSpeed)
}
我一直在考虑这个问题,我不确定这是否是一个好的解决方案?我有很多不同的动物类型,有很多常见属性,所以不要为每种不同的动物创建一个表格。
我认为最好将它们映射到我的ViewModel中的正确类型...
我不确定将我的ViewModel绑定到IAnimalModel界面是个好主意吗?因为我需要在显示某些属性之前检查模型类型。
另一个缺点是,在我的数据库中,我不知道每行包含哪种类型的动物......我想我可能需要在我的Animal表中添加一个ViewModelType列,但我不是确定这是一个很好的解决方案吗?
答案 0 :(得分:0)
我认为问题要坦诚得多。
你在谈论很多动物,但你可以根据类型进行思考,然后一切都会简化。 因此,基于一些非常快速的研究,您有6种动物类型:
你可以用更少的东西逃脱。因此,如果从这个角度来看你的问题,现在你没有那么多不同的类型可供查看。
因此,请使用动物类型枚举并使用它来区分您正在显示的字段。 就数据库而言,我不会使用一个表和空字段,因为这会使一切变得复杂。要么创建一个基本的,每个类型都有一个单独的,或者使用Nosql db并每行保存一个类型数据。
最后,我并不认为使用基本界面可以为您提供任何帮助。您仍然必须重复实现它的每个类中的字段,并且您在简化方面没有实现任何目标。如果您改为使用基本抽象类,那么至少您不必在任何地方重复相同的属性,而您的类现在更小并且正确地反映了差异。