0

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

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

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

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

但是,如果我从 Documents dbset 中提取 Document,它似乎不会被检测为采购订单或发票,并且无法转换为子类型。

我该如何做到这一点?

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

所以这样处理共同方面的代码可以被重用。

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

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>

ETC...

4

1 回答 1

0

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

例如:

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

视图myPartial接受类型的模型MyDerivedType。我的例子可能很无聊,但希望你能明白。

于 2012-08-01T20:20:57.580 回答