2010-05-18 56 views
0

所以我的應用程序在不斷增長,我想從基於JSON的控制器中分離出基於View的控制器。基本上,我有一堆控制器,他們所做的就是返回AJAX調用的JSON結果。ASP.NET MVC 2:應用領域和路線

我想要做的就是設置路由(以及我的Controllers文件夾下的文件夾結構),以便我的JSON控制器位於/ RPC /下,並且我的常規控制器位於/即我的JavaScript會調用/ RPC/SomeController/SomeAction,而我的常規頁面將位於/ SomeOtherController/SomeOtherAction下。

所以我所做的就是我建立了我的控制器的文件夾中,例如:

  • 控制器(文件夾)
    • RPC(文件夾)
      • JsonController1
      • JsonController2
    • ViewC ontroller1
    • ViewContoller2
    • ViewController3

我不能只是去/ RPC/JsonController1 /指數,並有工作,所以後來我建立了我的路線如下:

protected void Application_Start() 
{ 
AreaRegistration.RegisterAllAreas(); 

RegisterRoutes(RouteTable.Routes); 

// Register new annotations. 
DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(UniqueUsernameAttribute), typeof(UniqueUsernameValidator)); 
} 

public static void RegisterRoutes(RouteCollection routes) 
{ 
// Add the combres routes, too 
routes.AddCombresRoute("Combres"); 
routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

routes.MapRoute("RPC", 
    "RPC/{controller}/{action}/{id}", 
    new { controller = "None", action = "Index", id = UrlParameter.Optional }, 
    new[] { "Backplane.Web.Controllers.RPC" } 
); 

routes.MapRoute(
    "Default", // Route name 
    "{controller}/{action}/{id}", // URL with parameters 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults 
    new[] { "Backplane.Web.Controllers" } 
); 
} 

這工作太棒了!我的控制器可以在/ RPC /和/下訪問。不幸的是我可以有效地訪問/ RPC/ViewController1 /並且我也可以有效地訪問/ JsonController1 /。

看來,我對路由有一個基本的誤解,以及它如何與文件系統上的物理路徑相關。我需要一個自定義路線方案嗎?我想將所有這些保存在同一個項目中,因爲我希望將所有控制器都保存在同一個DLL中。

回答

0

路由與文件系統上的物理路徑無關(無論是在生成機器上還是在服務器上)。路由是在運行時執行的,此時沒有任何可以建議在特定類所在文件系統上的MVC路由處理程序的工件。因此,路由僅取決於路由表中路由的順序(取決於它們在Global.asax.cs中的順序),以及URL路徑部分如何映射到路由以及控制器類名稱和動作。

使您的方案工作的最簡單解決方案是刪除Default規則並列出根目錄下任何控制器的顯式規則。

另一種方法是將您的所有RPC控制器移入解決方案中的單獨區域(Areas/RPC/Controllers)。這些區域的工作方式是將任何/rpc/*路徑映射到RPC區域。這種方法也有一些注意事項,但通常它應該起作用,因爲區域路由是在主要路由之後註冊的,並且MVC路由嘗試避免使用屬於區域一部分的控制器,而URL映射到該區域。