2012-08-01 2 views
0

나는 또한 어떤 부분보기/ 는 서로 다른 속성

는 예를 들어, 다양한 유형의 구매 주문 또는 송장이 될 수있는 문서가를 호출하는 MVC보기를 표시하는 기본 유형의 하위 유형을 결정합니다. 서로 다른. 서 유형에는 고유 한 필드가있어 각각에는 고유하지 않습니다. 그들은 모두 기본 "Document"클래스의 속성을 가지고 있습니다.

내보기는 문서의 특정 유형에 따라 문서 세부 사항을 표시해야하지만 계속해서 모든 문서 유형이 갖는 공통 요소를 표시해야합니다.

코드를 복제 할 필요가 없도록 문서를 전달하고 문서의 고유 한 측면을 표시 할 때 문서의 하위 유형을 감지하고 스위치를 사용하십시오 문을 사용하여 해당 유형에 대한 특정 부분 뷰를 표시합니다.

그러나 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> 

등 ...

답변

0

나는 이것이 당신이 상속 구조를 가지고 있고, 당신이 주요보기로 기본 유형을 전달하고 이해하는 방법. 이 보기에서 공통 필드를 렌더링합니다. 실제 모델 유형이 파생 클래스 인 경우 메인보기에서 확인하고 Html.RenderPartial으로 전화 할 수 있습니다. 예를 들어

:

myPartial보기 유형 MyDerivedType의 모델을 받아
@if (Model is MyDerivedType) { 
    Html.RenderPartial("myPartial", (MyDerivedType)Model); 
} 

. 내 예제는 아마 borked지만, 잘하면 당신은 아이디어를 얻을.

+0

저는 실제로 Html.Action을 dpong하고 컨트롤러에서 스위치를 사용하고 있습니다! 그러나 " 'Production.Models.WorkOrder'에 'doc'(실제 'Production.Models.Document'유형이 있음)을 캐스팅 할 수 없습니다." –

+0

'Document'와 'WorkOrder'는 어떻게 관련되어 있습니까? – Matthew

+0

Document는 WorkOrder의 기본 클래스입니다. 따라서 WorkOrder는 Document에서 파생됩니다. 동일한 페이지를 사용해야하는 인보이스와 같은 다른 유형의 문서가있을 것입니다. –

관련 문제