实体IEnumerable只获取基类 - 而不是派生类

时间:2015-11-17 11:36:13

标签: c# asp.net asp.net-mvc entity-framework razor

我创建了一个名为Customer的基类,其中包含两个派生类PrivateCustomerBusinessCustomer。 这是我的实体模型:

enter image description here

在我看来,我需要显示所有客户的列表。但我还想展示他们是否是商业或私人客户,并获得一些特定信息,例如:私人客户。

我的观点需要模型@model IEnumerable<CarDealerMVC.Models.Customer>,它通过return View(db.CustomerSet.ToList());

从控制器获取模型

但是,该列表不包含派生对象 - 仅包含基础(Customer)。因此,虽然我可以通过@if (item is Models.PrivateCustomer)检查是否是商家或私人客户,但我无法打印PrivateCustomer特定属性,例如CPR。

我该怎么做?

2 个答案:

答案 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)
}

这种方式抽象出具体的具体实例,但不幸的是意味着重复你的共同基础属性,即IdName等。

答案 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
    }
}