我想知道是否可以根據路由動態添加布局到部分視圖。通過路由啓用/禁用剃刀布局
例如:
- http://my.app.com/Controller/GetForm - 返回的局部視圖
- http://my.app.com/Test/Controller/GetForm - 返回相同的局部視圖,但包裹在_Layout.cshtml
的點這裏是我不要創建具有重複功能的另一個視圖,而是動態設置Layout屬性。
謝謝。
我想知道是否可以根據路由動態添加布局到部分視圖。通過路由啓用/禁用剃刀布局
例如:
的點這裏是我不要創建具有重複功能的另一個視圖,而是動態設置Layout屬性。
謝謝。
試試這個:
行動
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
這可以工作,但我希望該過程對控制器透明。無論如何,您是否也可以爲您提供解決方案的路由設置? –
您可以創建,檢查路由集合和執行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);
}
這兩個控制器操作都返回'PartialView(someModel)'? –
GetForm會返回'PartialView(someModel)',是的。 /測試路線將採用該PartialView並添加布局。 –