在Controller方法中获取布局名称

本文关键字:布局 获取 Controller 方法 | 更新日期: 2023-09-27 18:27:46

我正在使用MVC 5,并希望在我的MVC控制器中覆盖下面的View方法

protected internal virtual ViewResult View(string viewName, string masterName, object model)

我可以有许多不同的布局视图,因此希望在运行时获得当前布局名称,并将其传递给overriden视图方法。如何在运行时在控制器中获取布局名称?

编辑我认为我不需要为我需要做的事情创建一个自定义视图引擎。我基本上只想在多个方法和控制器之间设置一个ViewBag值,不想重复我自己。我在运行时有viewName和model值,只是没有布局名称作为masterName参数传递

protected override ViewResult View(string viewName, string masterName, object model)
{
ViewBag.SomeValue = GetValue();            
return base.View(viewName, masterName, model);
}

在Controller方法中获取布局名称

您在运行时使用什么来做出决策会告诉你用哪个大师吗???也许你可以做一个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 }
            );

家庭控制器

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);
        }

视图根据需要创建布局视图,并将它们添加到共享文件夹和switch语句中。

测试URL的

http://localhost:64372/ -> Default Layout
http://localhost:64372/default/home/index
http://localhost:64372/test/ -> 2nd Layout
http://localhost:64372/test/home/index

希望这对你有用??