c# – 单项目区域维护视图的解决方案

我只在单个项目区域尝试过这个.因此,如果有人在多项目区域解决方案中尝试此操作,请告诉我们.

区域支持被添加到MVC2.但是,控制器的视图必须位于主视图文件夹中.我在这里提出的解决方案将允许您在每个区域保留您的区域特定视图.如果您的项目结构如下,则Blog是一个区域.

+ Areas          <-- folder
  + Blog         <-- folder
    + Views      <-- folder
      + Shared   <-- folder
      Index.aspx
      Create.aspx
      Edit.aspx
+ Content
+ Controllers
...
ViewEngine.cs

将此代码添加到Global.asax.cs中的Application_Start方法.它将清除您当前的视图引擎并使用我们的新ViewEngine.

// Area Aware View Engine
ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new AreaViewEngine());

然后创建一个名为ViewEngine.cs的文件并添加下面的代码.

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Web.Mvc;

namespace MyNamespace
{

    public class AreaViewEngine : WebFormViewEngine
    {
        public AreaViewEngine()
        {
            // {0} = View name
            // {1} = Controller name

            // Master Page locations
            MasterLocationFormats = new[] { "~/Views/{1}/{0}.master"
                                          , "~/Views/Shared/{0}.master"
                                          };

            // View locations
            ViewLocationFormats = new[] { "~/Views/{1}/{0}.aspx"
                                        , "~/Views/{1}/{0}.ascx"
                                        , "~/Views/Shared/{0}.aspx"
                                        , "~/Views/Shared/{0}.ascx"
                                        , "~/Areas/{1}/Views/{0}.aspx"
                                        , "~/Areas/{1}/Views/{0}.ascx"
                                        , "~/Areas/{1}/Views/Shared/{0}.aspx"
                                        , "~/Areas/{1}/Views/Shared/{0}.ascx"
                                        };

            // Partial view locations
            PartialViewLocationFormats = ViewLocationFormats;

        }

        protected override IView CreatePartialView(ControllerContext controllerContext, string partialPath)
        {
            return new WebFormView(partialPath, null);
        }

        protected override IView CreateView(ControllerContext controllerContext, string viewPath, string masterPath)
        {
            return new WebFormView(viewPath, masterPath);
        }

    }   // End Class AreaViewEngine

}       // End Namespace    

这将查找并使用您在您所在区域中创建的视图.

这是一种可能的解决方案,允许我在指定区域中保持视图.还有其他人有不同的,更好的,增强的解决方案吗?

谢谢

最佳答案 我很遗憾能成为那个告诉你的人,但你必须遗漏一些东西.我目前使用ASP.NET MVC 2 RC开箱即用.

我假设你有所有的注册路由,并在你的区域的视图文件夹中有正确的web.config文件?

也许看看this walk through,特别是关于创建区域的部分.

HTHS,
查尔斯

编辑:
好吧,所以你不喜欢投入额外的新{area =“blog’},null – 公平,我会承认它的傻瓜……但你还要做什么呢?

当你有两个同名的控制器时会发生什么?一个在你的根项目中,一个在一个区域中,还是两个控制器在两个不同的区域中具有相同的名称?如何找到正确的视图?

另外,我确实看到了ViewLocationFormats的问题.所有区域视图位置都没有参考其区域…例如〜/ Areas / {1} / Views / {0} .ascx – 它是如何知道哪个区域的?

如果您建议将所有不同区域的视图全部放入其控制器名称下的Regions文件夹中,然后在Views和Views / Shared下找到 – 我强烈建议不要这样做……它会很快变得混乱.

那么你离开了哪里?在创建路线时,您确实需要指定区域.它真的归结为这样一个事实:尽管它必须指定区域,但实际上没有别的办法.

点赞