2012-10-30 113 views
1

我正在使用MVC 3和MVC Contrib具有便攜式區域。問題是,便攜式領域有類似的觀點(例如,家庭,用戶管理...)。例如,每個便攜式區域都有一個主視圖(Views/Home/Index.cshtml)和一個主控制器(Controllers/Home.cs)。路由設置爲訪問該頁面,我將轉到MySite/PortableAreaName/Controller/View。便攜式區域具有相同的控制器/文件夾

問題是,它只加載第一個便攜式區域的家庭和用戶管理頁面。它首先找到該視圖,然後加載它,而不管URL中指定的區域。

我可以只加一些前綴(例如Area1Home,Area1UserManagement),但我寧願找到一個更具可擴展性的解決方案。如果我們有50個以上的可移植區域,每個區域都有10個視圖,那麼我們必須跟蹤我們使用的視圖名稱或每個視圖的前綴。

有什麼建議嗎?如果您需要更多信息,請告訴我。

更新1 - 沒有工作

使用鼻音並添加以下代碼到主項目(鏈接文章「PortableAreas」)提供的文章解決。

文章:http://elegantcode.com/2012/04/06/mvc-portable-areas/

主項目>的Global.asax.cs

protected void Application_Start() 
{ 
    // ... 
    AreaRegistration.RegisterAllAreas(); 
    PortableAreaRegistration.RegisterEmbeddedViewEngine(); 
    RegisterGlobalFilters(GlobalFilters.Filters); 
    RegisterRoutes(RouteTable.Routes); 
    // ... 
} 

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

    routes.MapRoute(
     "Default", 
     "{controller}/{action}/{id}", 
     new { controller = "Login", action = "Index", id = UrlParameter.Optional }, 
     new string[] { "PortableAreas.Controllers" } // main project namespace 
    ); 
} 

便攜式區> MyPortableAreaRegistration.cs

public class MyPortableAreaRegistration : PortableAreaRegistration 
{ 
    public override string AreaName 
    { 
     get 
     { 
      return "MyPortableArea"; 
     } 
    } 

    public override void RegisterArea(AreaRegistrationContext context, IApplicationBus bus) 
    { 
     RegisterRoutes(context); 
     RegisterAreaEmbeddedResources(); 
    } 

    private void RegisterRoutes(AreaRegistrationContext context) 
    { 
     context.MapRoute(
      AreaName + "_default", 
      base.AreaRoutePrefix + "/{controller}/{action}/{id}", 
      new { action = "Index", id = UrlParameter.Optional }, 
      new[] { "MyPortableArea.Controllers", "MvcContrib" } 
     ); 
    } 
} 

據我明白了,以下位置是資源的默認值:

  • MyPortableArea /內容/圖片
  • MyPortableArea /腳本

只要你保持你的資源,在這些文件夾,你不應該來註冊它們。

更新2

先前修訂沒有工作。即使使用上面的代碼,它仍然有時會加載錯誤的視圖,資源等。任何人都知道如何解決這個問題?

當我調試,它關係到正確的控制器和控制器內的右視圖,但加載了錯誤的視圖(例如它對區域2的控制器和區域2的主頁的方法,但負載區域1的主頁。

例如,我有2個便攜式領域,但它總是加載第一個

MyPortableArea1 /控制/主頁,MyPortableArea1 /腳本/瀏覽/首頁/ index.js MyPortableArea2 /控制/主頁,MyPortableArea2 /腳本/瀏覽/首頁/指數。js

我認爲這是因爲它一次註冊了所有它們?然後,當它找到匹配的路線時,它使用第一個匹配(有時是錯誤的)。

更新3

逐句通過代碼後,似乎在我的佈局的部分是什麼沒有正確加載。例如,它到達MyPortableArea2的HomeController> Index(),加載佈局,然後該佈局在@RenderBody()部分加載MyPortableArea1的內容。

更新4

http://mvccontrib.codeplex.com/更新到MvcContrib的最新版本。這沒有奏效。

更新5

所以我做了一個小測試,並想通了,爲什麼它加載錯誤的頁面:它無法找到區都沒有。這就像它甚至不在系統中!

E.g. PortableArea1/Home/Index

public ActionResult Index() 
{ 
    return View("~/Areas/PortableArea1/Views/Home/Index.cshtml"); 
} 

E.g. PortableArea2 /首頁/指數

public ActionResult Index() 
{ 
    return View("~/Areas/PortableArea2/Views/Home/Index.cshtml"); 
} 

當它加載錯誤的頁面,我現在得到一個錯誤說的觀點是沒有找到。爲什麼不加載我的便攜式區域?

回答

3

您可能想重寫RegisterAreas(),併爲每個區域實現RegisterRoutes()。

這裏是一個很好的文章很好地解釋了:http://elegantcode.com/2012/04/06/mvc-portable-areas/

希望它能幫助。

+0

我能夠得到它的工作,但在我的主要項目(「鏈接文章」中的「PortableAreas」)中,我看到了需要被我所有便攜式區域訪問的視圖。如果我完全按照這篇文章,從我的主項目中擺脫RegisterRoutes,它可以工作,但會中斷所有主要項目URL(例如,MySite/MainProjController/MainProjView)。 – Lifes

+0

有時候這種方式有效,有時卻不行。我認爲它與應用程序池或IIS需要重置有關,但我不確定。有什麼想法嗎? – Lifes

0

這可能是您的Area的_ViewStart.cshtml文件的結果。這是一個有點單調的文件:

@{ 
Layout = "~/someurl"; 
} 

這將定義在哪個區域內爲每個視圖加載基本頁面。該文件與該區域的web.config文件具有相同的範圍。

+0

到目前爲止,這似乎工作,但我會給它更多的時間(一個星期左右)。 – Lifes

+0

這沒有奏效。它今天再次切換... – Lifes