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

时间:2012-08-01 20:09:11

标签: c# asp.net-mvc-4

我有一个MVC视图也调用了一些部分视图/

有一个可以是不同类型的文档,例如采购订单或发票。每种不同的文档类型都有一些唯一的字段,而另一个没有。它们都具有基础“文档”类的一些属性。

我的视图需要根据特定文档类型显示文档详细信息,然后继续显示所有文档类型的常用元素。

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

但是,如果我从文档dbset中提取文档,它似乎不会被检测为采购订单或发票,也不能转换为子类型。

我如何做到这一点?

拿一份文件 - >确定它是哪种类型 - >在部分视图中显示唯一详细信息 - >在部分视图中显示通用详细信息。

因此,可以重用处理公共方面的代码。

某些上下文代码: 主控制器:

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)

次要行动:

public ActionResult DisplayDocumentDetails(Document doc)
    {
        switch (doc.DocumentType)
        {
            case "WorkOrder":
                return View("_DisplayWorkOrderDetails");
        }
                return null;

    }

次要视图:

@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>

等...

1 个答案:

答案 0 :(得分:0)

我理解这一点的方法是你有一个继承结构,并且你将基类型传递给 main 视图。在此视图中,您将呈现公共字段。如果实际的模型类型是派生类,您可以在视图中进行检查并调用Html.RenderPartial

例如:

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

myPartial视图接受MyDerivedType类型的模型。我的例子可能已经过去了,但希望你能得到这个想法。