【问题标题】:Get Layout name in Controller method在Controller方法中获取布局名称
【发布时间】:2015-12-22 00:12:28
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 我认为您正在谈论创建自定义 ViewEngine。看一些例子:codeproject.com/Articles/294297/…weblogs.asp.net/imranbaloch/…
  • @MichaelLake 我认为我不需要创建自定义视图,我认为这对我想要的东西来说太过分了,我在上面进行了编辑以显示我想要实现的目标。
  • @Gene,如果用 View 方法做我正在尝试的事情不容易,那么我会看看 FilterAttribute。我只是认为获取视图的布局名称会更直接,但我可能错了。
  • 你最终想要完成什么?这可能很难,因为不应该这样做。

标签: c# asp.net-mvc asp.net-mvc-5


【解决方案1】:

您在运行时使用什么来做出决定 - 是否有一些标识符 会告诉你用哪个大师???也许你可以做一个开关?

Switch (loggedInUser.SomeSpecialValue)
{
Case: "value1":
return "_Layout1.cshtml";
}

您还打算如何决定要显示哪个布局?

编辑:好的扩展上述想法 - 也许这样的东西可以帮助你:

路由配置

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

观看次数 根据需要创建 Layout 视图,并将它们添加到 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

希望这对你有用吗??

【讨论】:

  • 当前没有自定义属性集。我不认为我需要设置一个。我认为 Request 或 ControllerContext 上会有一些属性,或者控制器中请求管道中的其他属性之一将具有当前布局名称,我只需将其传递给覆盖的 View 方法。
  • 我仍然不能 100% 确定您如何尝试解决您的问题 - 您有很多布局文件(很好),并且您希望能够看到哪个正在使用(很好)但是如何您是在选择首先使用哪一个吗?这是您选择的尝试吗?在这种情况下,您首先需要一种选择布局的方法,然后存储该选择(可能是 cookie),然后您将能够稍后再次访问该值。
  • 布局只是通过 _ViewStart 文件设置。因为我想从 BaseController 调用我的方法,所以在多个不同的文件夹中可能会有不同的 _ViewStart 文件。我想在不添加 cookie 来存储当前选定的 Layout 属性的情况下执行此操作。我将改变我的方法,只使用一个 ActionFilter,而不用担心布局页面。感谢您的努力。
猜你喜欢
  • 1970-01-01
  • 2014-02-18
  • 2011-03-20
  • 2012-03-27
  • 2017-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-08
相关资源
最近更新 更多