2011-09-19 38 views
1

我想知道是否可以根據路由動態添加布局到部分視圖。通過路由啓用/禁用剃刀布局

例如:

的點這裏是我不要創建具有重複功能的另一個視圖,而是動態設置Layout屬性。

謝謝。

+1

這兩個控制器操作都返回'PartialView(someModel)'? –

+0

GetForm會返回'PartialView(someModel)',是的。 /測試路線將採用該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); 
}