2010-02-02 77 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

相關問題