ASP.NET MVC 2:应用程序区域和路由

时间:2010-05-18 23:31:28

标签: asp.net-mvc-2 routing

所以我的应用程序正在增长,我想从基于JSON的控制器中分离出基于视图的控制器。基本上,我有一堆控制器,他们所做的只是为AJAX调用返回JSON结果。

我想要做的是设置路由(以及我的Controllers文件夹下的文件夹结构),以便我的JSON控制器位于/ RPC /下,而我的常规控制器位于/ - ie下我的JavaScript会调用/ RPC / SomeController / SomeAction,我的常规页面将存在于/ SomeOtherController / SomeOtherAction下。

所以我做的是设置我的Controllers文件夹:

  • 控制器(文件夹)
    • RPC(文件夹)
      • JsonController1
      • JsonController2
    • ViewController1
    • ViewContoller2
    • ViewController3

我无法直接转到/ RPC / JsonController1 / Index并开始工作,所以我按如下方式设置路线:

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中。

1 个答案:

答案 0 :(得分:0)

路由与文件系统上的物理路径无关(在构建计算机上或服务器上)。路由在运行时执行,此时没有任何工件会建议MVC路由处理程序在文件系统特定类所在的位置。因此,路由仅依赖于路由表中路由的顺序(这取决于它们在Global.asax.cs中的顺序)以及URL路径部分如何映射到路由和控制器类名称以及动作。

使方案有效的最简单方法是删除Default规则并列出根目录下任何控制器的显式规则。

另一种方法是将所有RPC控制器移动到解决方案中的单独区域(区域/ RPC /控制器)。区域的工作方式是任何/rpc/*路径都映射到RPC区域。这种方法也有一些注意事项,但一般来说它应该有效,因为区域路由在主路径之后注册,而MVC路由尝试避免使用属于URL的区域的控制器映射到该区域。