C# 确定基类型的子类型以显示不同的属性

C# 确定基类型的子类型以显示不同的属性,c#,asp.net-mvc-4,C#,Asp.net Mvc 4,我有一个MVC视图,它也调用一些局部视图/ 有一个文档可以是不同类型的,例如采购订单或发票。每种不同的文档类型都有一些其他文档类型没有的唯一字段。它们都有一些来自基本“Document”类的属性 “我的视图”需要根据文档的特定类型显示文档详细信息,但随后继续并显示所有文档类型都具有的公共元素 我希望将文档作为文档传递,这样就不必重复代码,然后在显示文档的唯一方面时,只需检测文档是哪一个子类型,并使用switch语句显示该类型的特定局部视图 但是,如果我从Documents数据库集中提取文档,它将

我有一个MVC视图,它也调用一些局部视图/

有一个文档可以是不同类型的,例如采购订单或发票。每种不同的文档类型都有一些其他文档类型没有的唯一字段。它们都有一些来自基本“Document”类的属性

“我的视图”需要根据文档的特定类型显示文档详细信息,但随后继续并显示所有文档类型都具有的公共元素

我希望将文档作为文档传递,这样就不必重复代码,然后在显示文档的唯一方面时,只需检测文档是哪一个子类型,并使用switch语句显示该类型的特定局部视图

但是,如果我从Documents数据库集中提取文档,它将不会被检测为采购订单或发票,并且不能转换为子类型

我如何做到这一点

获取文档->确定其类型->在局部视图中显示唯一详细信息->在局部视图中显示一般详细信息

因此,通过这种方式,可以重用处理公共方面的代码

上下文的一些代码: 主控制器:

public ActionResult Main(string doctype, int id)
    {
        ActionCenterViewModel acvm = new ActionCenterViewModel();
        acvm.Document = db.Documents
            .Where(i => i.ID == id)
            .SingleOrDefault();
    return View(acvm);
}
主要观点:

@model Production.ViewModels.ActionCenterViewModel
@{
ViewBag.Title = "Main";
}
<link rel="stylesheet" type="text/css" href="@Url.Content("~/Content/actioncenter.css")" />
@Html.Action("DisplayDocumentDetails", Model.Document)
次要视图:

@model Production.Models.WorkOrder

<div id="documentDetails">
<div class="actionCenterDocInfoLabel fLeft">WorkOrder:</div> 
<div class="actionCenterDocInfoValue fLeft"> @Model.ID</div>

<div class="actionCenterDocInfoLabel fLeft leftMargin20">Vendor:</div> 
<div class="actionCenterDocInfoValue fLeft"> @Model.Vendor.FriendlyName</div>
@model Production.Models.WorkOrder
工作顺序:
@Model.ID
小贩:
@Model.Vendor.FriendlyName

等等。

我的理解是,您有一个继承结构,并且正在将基类型传递给主视图。从这个主视图可以渲染公共字段。如果实际模型类型是派生类,则可以在主视图中进行检查,并调用
Html.RenderPartial

例如:

@if (Model is MyDerivedType) {
    Html.RenderPartial("myPartial", (MyDerivedType)Model);
}

其中,
myPartial
视图接受类型为
MyDerivedType
的模型。我的示例可能是borked,但希望您能理解。

我实际上正在使用一个Html.Action,并且我正在控制器中使用一个开关!但我“无法将'doc'(其实际类型为'Production.Models.Document')转换为'Production.Models.WorkOrder'”。
Document
WorkOrder
之间的关系如何?Document是WorkOrder的基类。所以WorkOrder派生自文档。还有其他类型的文档(如发票)需要使用相同的页面。主控制器似乎知道该文档是一个工作订单,尽管我从db.documents中提取了它。但是,当它通过视图,然后进入DocumentDetails控制器时,它会丢失它,并且不让我知道您使用的是强类型视图吗?
@if (Model is MyDerivedType) {
    Html.RenderPartial("myPartial", (MyDerivedType)Model);
}