2011-09-19 5 views
1

라우팅을 기반으로 부분 뷰에 레이아웃을 동적으로 추가 할 수 있는지 궁금합니다.라우팅을 통한 면도기 레이아웃 사용/사용 안함

예를 들어

:

점 여기 _Layout.cshtml에 싸여 내가 돈 '이다 중복 된 기능으로 다른보기를 만들고 싶지만 동적으로 Layout 속성을 설정하십시오.

감사합니다.

+1

두 컨트롤러가 'PartialView (someModel)'을 반환합니까? –

+0

GetForm은'PartialView (someModel)'을 반환합니다./Test Route는 PartialView를 사용하여 레이아웃을 추가합니다. –

답변

0

이 시도 :

액션

public ActionResult Index() { 
    ViewBag.Layout = null; 

    object layout; 
    if (RouteData.Values.TryGetValue("layout", out layout)) { 
     switch(layout.ToString()) 
     { 
      case "Layout1": 
       ViewBag.Layout = "~/Views/Shared/_Layout.cshtml"; 
       break; 
      // ... 
     } 
    } 

    return PartialView("Test"); 
} 

마크 업

@{ 
    Layout = ViewBag.Layout; 
} 

<div>This is the test page...</div> 

라우팅 설정

routes.MapRoute(
    "Default", // Route name 
    "{controller}/{action}", // URL with parameters 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }); // Parameter defaults 

routes.MapRoute(
    "DefaultWithLayout", // Route name 
    "{layout}/{controller}/{action}", // URL with parameters 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }); // Parameter defaults 
} 

하거나

routes.MapRoute(
    "Default", // Route name 
    "{controller}/{action}/{layout}", // URL with parameters 
    new { controller = "Home", action = "Index", layout = UrlParameter.Optional, id = UrlParameter.Optional }); // Parameter defaults 
+0

이 작업은 가능하지만 프로세스를 컨트롤러에 투명하게 보여주고 싶습니다. 어떤 경우이든 솔루션 라우팅을 제공 할 수 있습니까? –

1

당신은 경로 수집을 확인하고 PartialViewResult 또는 ViewResult를 실행하는 사용자 정의보기 결과를 만들 수 있습니다. 그리고 View() 또는 PartialView() 대신에 사용하십시오.

// constructor goes here which accepts model and view name 

public override void ExecuteResult(ControllerContext context) 
{ 
    ViewResultBase viewResult; 
    // some check 
    if(context.RouteData.Values || context.HttpContext.Request.RawUrl ) 
    { 
     viewResult = new ViewResult(); 
    }else 
    { 
     viewResult = new PartialViewResult(); 
    } 
    viewResult.ExecuteResult(context); 
}