c# - 实体 IEnumerable 仅获取基类 - 而不是派生类

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

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

enter image description here

在我看来,我需要显示所有客户的列表。但我也想表明他们是企业客户还是私有(private)客户,并获取一些具体信息,例如私有(private)客户。

我的 View 需要模型@model IEnumerable<CarDealerMVC.Models.Customer>它通过 return View(db.CustomerSet.ToList()); 从 Controller 获取模型

但是,该列表不包含派生对象 - 仅包含基础对象 ( Customer )。因此,虽然我可以通过@if (item is Models.PrivateCustomer)检查它是企业还是私有(private)客户。 ,我无法打印 PrivateCustomer特定属性,例如心肺复苏术

我怎样才能做到这一点?

最佳答案

这可以使用 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

然后在您的 View 中,您需要按如下方式循环集合,使用反射在运行时定位模板:

@foreach(var item in Model)
{
    @Html.DisplayFor(x => item, item.GetType().Name)
}

这种方式抽象出特定的具体实例,但不幸的是意味着公共(public)基本属性的重复,即 IdName 等。

关于c# - 实体 IEnumerable 仅获取基类 - 而不是派生类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33755945/

相关文章:

c# - HttpWebRequest .GetResponse 抛出 WebException 'The operation has timed out'

c# - 将窗体转换为用户控件

c# - 从 Azure Blob 存储反序列化对象的最快方法?

c# - 传递特定的日期格式

ASP.NET 输出缓存不适用于 IIS7.5

javascript - SignalR 仅在事件 SILO 中可用

c# - 类型或命名空间名称 'UI' 在命名空间 'UnityEngine' 中不存在

javascript - 使用 anchor 时在 Firefox 中重新加载页面?

c# - Google Analytics API BatchRequest - 过滤/回调

c# - 使用 LINQ 查询获取字段值