IF-문

2013-10-28 4 views
-1

는이 같은 현재 활성 컨트롤러를 기반으로 표시되는 컨텍스트를 기반으로 메뉴가 asp.net의 MVC의 스위치 내부 :IF-문

@switch (this.ViewContext.RouteData.Values["controller"].ToString().ToLower()) 
       { 
        case "unitdetails": 
         Html.RenderPartial("_ContextMenu"); 
         break; 
        case "operation": 
         Html.RenderPartial("_ContextMenu"); 
         break; 
        case "trend": 
         Html.RenderPartial("_ContextMenu"); 
         break; 
        case "wellguide": 
         Html.RenderPartial("_ContextMenu"); 
         break; 
        case "setup": 
         Html.RenderPartial("_ContextMenu"); 
         break; 
        case "site": 
         Html.RenderPartial("_ContextMenu"); 
         break; 
        case "alarms": 
         Html.RenderPartial("_ContextMenu"); 
         break; 
        case "asx": 
         Html.RenderPartial("_ContextMenu"); 
         break; 
        case "reports": 
       } 

오늘까지 벌금 근무를, 내가 건너 온 문제. 내 컨트롤러에는 몇 가지 다른 조치가 있지만 메뉴를 모두 표시하지는 않습니다. 그래서, 현재 작업이 내 _ContextMenu 렌더링 해야하는지 확인하기 위해 "보고서"사건을 조사해야합니다. 이의 라인을 따라

겠습니까 뭔가 적절 :

case "reports": 
    if (this.ViewContext.RouteData.Values["action"].ToString().ToLower() == "unitactivity") 
    { 
     Html.RenderPartial("_ContextMenu"); 
     break; 
    } 
    else 
    { 
     goto default; 
    } 
내가 말하는 예외가 발생,이 작업을 얻이 수없는 것

(참고 : 나는 네임 스페이스 제거) : Message='UnitActivityModel' does not contain a definition for 'ViewUnitContract'

을 이것은 스위치의 다른 모든 경우와 잘 작동하지만 현재 동작을 확인하기 시작할 때 문제가 발생합니다. 어떤 제안? 다른 컨트롤러는보기에 강하게 입력 된 UnitActivityModel을 사용합니다.

+0

정확히 '스위치'문장의 요점은 무엇입니까? 'case'에 관계없이 똑같은 일을합니다 ...? –

+0

모든 컨트롤러에 대해 동일한 부분 뷰를 표시해야합니다. 좀 지저분한 일 이겠지만, 그것이 내가 처음부터 잘 작동하도록하는 방법입니다. –

+3

@NicklasWinger는 모든 경우에 동일한 코드를 반복하지 않습니다. case 대신 "unitdetails"를 사용하십시오 : case "site": ... case "asx": Html.RenderPartial ("_ ContextMenu"); break;' –

답변

1

많은 의사 결정 코드를보기에 넣는 것은 일반적으로 좋지 않습니다. 가능한 경우 데이터에 대한 뷰를 남겨두고 의사 결정을 컨트롤러로 보냅니다 (또는 최악의 경우 부분보기로 표시됨, yuk). , 이것은 당신의 MenuController.ContextMenu(string id) 액션 메소드 현재 컨트롤러의 이름을 전달합니다

Html.RenderAction("ContextMenu", "Menu", new { id = this.ViewContext.RouteData.Values["controller"].ToString().ToLower() }); 

: 귀하의 경우

, 대신 Html.RenderPartial는 인라인 코드 스타일을 선호하는

@Html.Action("ContextMenu", "Menu", new { id = this.ViewContext.RouteData.Values["controller"].ToString().ToLower() }) 

또는

같은 것을 시도 여기서 id는 컨트롤러 이름을 수신합니다.

예 :

내 개인적인 취향은 [Bind] (나는 일반 id 싫어)를 사용하여 의미있는 매개 변수 이름을 가지고있다

MenuController.ContextMenu([Bind(Prefix="id")]string controllerName) 

그런 다음 메뉴 컨트롤러에서 의사 결정을 내리고 부분을 반환 (또는 여러 부분 지문 중 하나) 또는 (NO 메뉴)도 return EmptyResult() 수 있습니다.

이 추가 컨트롤러 호출의 결과는 다른 부분보기와 마찬가지로 배치되어 렌더링됩니다.