2010-05-18 112 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映射到该区域。