2010-02-02 42 views
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  

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

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

谢谢

+0

在“区域”文件夹中使用“添加区域”时,会在新区域下创建“视图”子文件夹。你确定你没有错过什么吗? – 2010-02-02 22:55:40

+0

你是对的,它会创建一个Views文件夹。但是,这些视图必须位于要找到的主项目的视图文件夹中。请参阅http://forums.asp.net/p/1494640/3540105.aspx,首先回答这个问题。 – 37Stars 2010-02-02 23:05:34

+0

+1嗯,你的方法是健全的。事实上,我无法想象为什么MVC的人没有在主版本中包含额外的路径。没有意义。 – 2010-02-02 23:23:22

回答

0

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

2

对不起,成为一个告诉你这个,但你必须错过的东西。我目前已经开始使用ASP.NET MVC 2 RC开箱即用了。

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

也许看看this walk through,尤其是关于创建区域的部分。

HTHS,
查尔斯

编辑: 好了,你不开心投入额外new { area = "blog' }, null - 很公平,我承认它的小动作......但还有什么你要做?

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

此外,我确实发现您的ViewLocationFormats存在问题。所有的区域视图位置都没有涉及它们的区域...... ~/Areas/{1}/Views/{0}.ascx - 它怎么知道什么地方?

如果你是暗示所有不同地区的风景,并根据其控制器名称扔进Areas文件夹,然后找到ViewsViews/Shared下 - 我会强烈建议针对......它会变得一团糟很快。

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

+0

查尔斯你是对的。此解决方案将工作。但是,如果您在链接中引用了此解决方案,则必须为每个ActionLink添加区域。 我所展示的解决方案并不需要为您的任何链接添加区域。所以它成为一个偏好问题。就我个人而言,我不想为不在某个区域的视图添加',new {area =“”},null'“。 感谢您的回答。我确实喜欢参加这个练习。 – 37Stars 2010-02-03 14:55:17

相关问题