我正在使用MVC 5并希望在我的MVC控制器中覆盖以下View方法
protected internal virtual ViewResult View(string viewName, string masterName, object model)
我可以拥有许多不同的布局视图,因此希望在运行时获取当前布局名称并将其传递给overriden视图方法。如何在控制器中获取运行时的布局名称?
EDIT 我认为我不需要为我需要创建的自定义视图引擎。我基本上只想在多个方法和控制器之间设置ViewBag值,并且不想重复自己。我在运行时有viewName和model值,只是没有要作为masterName参数传递的布局名称
protected override ViewResult View(string viewName, string masterName, object model)
{
ViewBag.SomeValue = GetValue();
return base.View(viewName, masterName, model);
}
答案 0 :(得分:0)
您在运行时使用什么来做出决定 - 是否有一些标识符 会告诉你哪个大师要用???也许你可以制作一个Switch?
Switch (loggedInUser.SomeSpecialValue)
{
Case: "value1":
return "_Layout1.cshtml";
}
您还打算如何决定要显示哪种布局?
编辑:好的扩展上述想法 - 也许这样的事情可以帮助你:
<强> RouteConfig 强>
routes.MapRoute(
name: "Default",
url: "{layout}/{controller}/{action}/{id}",
defaults: new { layout = "default", controller = "Home", action = "Index", id = UrlParameter.Optional }
);
<强>的HomeController 强>
protected override ViewResult View(string viewName, string masterName, object model)
{
var layout = RouteData.Values["layout"].ToString();
switch (layout)
{
case "default":
return base.View(viewName, "_layout", model);
case "test":
return base.View(viewName, "_layout2", model);
}
return base.View(viewName, masterName, model);
}
<强>视图强> 根据需要创建布局视图,并将它们添加到Shared文件夹和switch语句。
测试网址
http://localhost:64372/ -> Default Layout
http://localhost:64372/default/home/index
http://localhost:64372/test/ -> 2nd Layout
http://localhost:64372/test/home/index
希望这对你有用吗?