4

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

区域支持已添加到 MVC2。但是,您的控制器的视图必须在您的主视图文件夹中。我在这里介绍的解决方案将允许您在每个区域中保留您所在区域的特定视图。如果您的项目结构如下,博客是一个区域。

+ 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    

这将找到并使用您在您的区域中创建的视图。

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

谢谢

4

2 回答 2

2

我很抱歉成为那个告诉你这个的人,但你一定错过了什么。我目前使用 ASP.NET MVC 2 RC 开箱即用您的方案。

我假设您拥有所有注册路线并且在您所在区域的视图文件夹中拥有正确的 web.config 文件?

也许看看这个演练,尤其是关于创建区域的部分。

HTH,
查尔斯

编辑:好的,所以你对额外的投入不满意new { area = "blog' }, null- 很公平,我承认它很琐碎......但是你还要做什么?

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

另外,我确实看到您的ViewLocationFormats. 所有区域视图位置都没有参考它们的区域......例如~/Areas/{1}/Views/{0}.ascx- 它如何知道哪个区域?

如果您建议将所有不同区域的视图全部放入Areas其控制器名称下的文件夹中,然后在Viewsand下找到Views/Shared- 我强烈建议不要这样做......它很快就会变得一团糟。

那么,这让你何去何从?它确实让您在创建路线时需要指定区域。这真的归结为这样一个事实,虽然它必须指定区域,但实际上没有其他方法。

于 2010-02-02T23:57:51.743 回答
0

该解决方案在 Mvc2 中运行良好。在 Mvc3 中没有必要。

于 2011-07-08T14:07:13.370 回答