【发布时间】:2013-04-18 10:56:46
【问题描述】:
这可能很简单,但无法弄清楚。假设我有一个“项目”模型,并且从该模型继承的模型是“DVD”、“CD”、“游戏”,例如,我希望能够进入项目的索引视图并获取项目的类型它是。显然 GetType() 是行不通的。反正我能做到吗?
谢谢
【问题讨论】:
标签: inheritance asp.net-mvc-4 ef-code-first views entity-framework-5
这可能很简单,但无法弄清楚。假设我有一个“项目”模型,并且从该模型继承的模型是“DVD”、“CD”、“游戏”,例如,我希望能够进入项目的索引视图并获取项目的类型它是。显然 GetType() 是行不通的。反正我能做到吗?
谢谢
【问题讨论】:
标签: inheritance asp.net-mvc-4 ef-code-first views entity-framework-5
GetType() 不起作用吗?
我假设您从控制器传递到视图的模型是 DVD、CD 或游戏,但视图中声明的模型是 Item?
在这个小程序(LinqPad - Yay)中,输出是“这是一张 CD”。这不是你想要的吗?
void Main()
{
Item cd = new CD();
Type modelType = cd.GetType();
if(modelType == typeof(CD)){Console.WriteLine("this is a CD");}
}
public class Item{}
public class CD: Item{}
警告:我没有在视图中对此进行测试,因为 VS2012 更新 2 刚刚杀死了 VS(未响应)。哼哼。
【讨论】:
您的
Type是您的鉴别器。
查看我之前的这篇文章 - Entity Framework 5 - Enum based Discriminator for derived classes
您可以使用is 运算符来测试类型。
或者让你的财产 - 如果你真的想这样做(但我从来没有需要)......
public class Item
{
[NotMapped()]
public virtual MyEnum MyEnum { get { return MyEnum.Item; } }
}
public class DVD: Item
{
[NotMapped()]
public override MyEnum MyEnum { get { return MyEnum.DVD; } }
}
public class CD: Item
{
[NotMapped()]
public override MyEnum MyEnum { get { return MyEnum.CD; } }
}
但我总是只做if(item is DVD)
如果你真的想要,也可以使用.GetType().Name。
【讨论】:
每个人都对,显然很容易 在任何你想要的视图中,只需写:
@Html.DisplayTextFor(modelItem => item.GetType().Name)
【讨论】: