【问题标题】:Pointing all actions without specified view to one concrete view将所有没有指定视图的动作指向一个具体视图
【发布时间】:2012-03-06 02:35:39
【问题描述】:

我正在创建 99% 基于一个视图的高级网站。我创建了以下代码,负责将所有没有对应视图的控制器操作指向通用视图:~/Views/Shared/UniversalView.cshtml。

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();

    RegisterGlobalFilters(GlobalFilters.Filters);
    RegisterRoutes(RouteTable.Routes);

    foreach (IViewEngine engine in ViewEngines.Engines)
    {
        if (engine is RazorViewEngine)
        {
            RazorViewEngine razorEngine = (RazorViewEngine)engine;
            var locationFormats = razorEngine.ViewLocationFormats;
            List<string> l = new List<string>(locationFormats);
            l.Add("~/Views/Shared/UniversalView.cshtml");
            razorEngine.ViewLocationFormats = l.ToArray();
        }
    }
}

我很确定会有更好的方法来实现这种效果。有任何想法吗?

【问题讨论】:

    标签: asp.net-mvc-3 model-view-controller viewengine asp.net-mvc


    【解决方案1】:

    你可以声明一个 BaseController 并且你的所有控制器都必须继承自它。

    然后在 BaseController 中添加一个方法就像

        public ViewResult UniversalView(string viewName="UniversalView")
        {
            return View(viewName);
        }
    

    您可以从其他控制器调用此方法而不是传统的 View()。 如果您要指定视图名称,它将采用该视图,否则默认为通用视图。

        public ActionResult About()
        {
            return UniversalView();
        }
    

    【讨论】:

    • 感谢您的回答。我之前考虑过这个解决方案,但有一个区别,我在考虑从控制器类继承并覆盖 View 方法,然后我害怕控制器复杂性的原因。恕我直言,这是一个很好的解决方案,但它要求程序员记住从自定义控制器类派生,因此很难维护。
    【解决方案2】:

    我只会在所有相关操作中使用该视图:

    ...
    return View("UniversalView");
    

    但如果你真的想走自己的路。看看 ExecuteResult 方法link 并用它来实现你想要的。

    【讨论】:

    • 感谢您的回答。该解决方案将很难维护,因为几乎在每个操作中我都应该记住返回 View("~/Views/Shared/UniversalView.cshtml");
    猜你喜欢
    • 2011-01-12
    • 1970-01-01
    • 2018-03-20
    • 1970-01-01
    • 1970-01-01
    • 2018-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多