我只在單個項目區域嘗試過這種方法。因此,如果有人在多項目領域解決方案中嘗試了這一點,請告訴我們。在單個項目區域維護視圖的解決方案
區域支持已添加到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
這將找到並使用您在您所在地區創建的視圖。
這是一種可能的解決方案,允許我在指定區域保留視圖。其他人是否有不同的,更好的增強型解決方案?
謝謝
在「區域」文件夾中使用「添加區域」時,會在新區域下創建「視圖」子文件夾。你確定你沒有錯過什麼嗎? – 2010-02-02 22:55:40
你是對的,它會創建一個Views文件夾。但是,這些視圖必須位於要找到的主項目的視圖文件夾中。請參閱http://forums.asp.net/p/1494640/3540105.aspx,首先回答這個問題。 – 37Stars 2010-02-02 23:05:34
+1嗯,你的方法是健全的。事實上,我無法想象爲什麼MVC的人沒有在主版本中包含額外的路徑。沒有意義。 – 2010-02-02 23:23:22