我创建了一个名为Customer
的基类,其中包含两个派生类PrivateCustomer
和BusinessCustomer
。
这是我的实体模型:
在我看来,我需要显示所有客户的列表。但我还想展示他们是否是商业或私人客户,并获得一些特定信息,例如:私人客户。
我的观点需要模型@model IEnumerable<CarDealerMVC.Models.Customer>
,它通过return View(db.CustomerSet.ToList());
但是,该列表不包含派生对象 - 仅包含基础(Customer
)。因此,虽然我可以通过@if (item is Models.PrivateCustomer)
检查是否是商家或私人客户,但我无法打印PrivateCustomer
特定属性,例如CPR。
我该怎么做?
答案 0 :(得分:5)
这可以使用DisplayFor
模板来实现,为每种不同的具体元素类型声明@Model
类型。
作为示例Shared/DisplayTemplates/PrivateCustomer.cshtml
:
@Model PrivateCustomer
@Model.Id
@Model.Name
@Model.Phone
@Model.Cpr
@Model.Genger
Shared/DisplayTemplates/BusinessCustomer.cshtml
:
作为示例Shared/DisplayTemplates/BusinessCustomer.cshtml
:
@Model BusinessCustomer
@Model.Id
@Model.Name
@Model.VatNumber
@Model.Fax
然后在您的视图中,您需要按如下方式循环集合,使用反射在运行时定位模板:
@foreach(var item in Model)
{
@Html.DisplayFor(x => item, item.GetType().Name)
}
这种方式抽象出具体的具体实例,但不幸的是意味着重复你的共同基础属性,即Id
,Name
等。
答案 1 :(得分:0)
通过强制转换为适当的类型。
例如:
@foreach (var customer in Model)
{
var businessCustomer = customer as Models.BusinessCustomer;
if (businessCustomer != null)
{
@businessCustomer.VatNumber
}
var privateCustomer = customer as Models.PrivateCustomer;
if (privateCustomer != null)
{
@privateCustomer.Cpr
}
}