所以我的应用程序正在增长,我想从基于JSON的控制器中分离出基于视图的控制器。基本上,我有一堆控制器,他们所做的只是为AJAX调用返回JSON结果。
我想要做的是设置路由(以及我的Controllers文件夹下的文件夹结构),以便我的JSON控制器位于/ RPC /下,而我的常规控制器位于/ - ie下我的JavaScript会调用/ RPC / SomeController / SomeAction,我的常规页面将存在于/ SomeOtherController / SomeOtherAction下。
所以我做的是设置我的Controllers文件夹:
我无法直接转到/ 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中。
答案 0 :(得分:0)
路由与文件系统上的物理路径无关(在构建计算机上或服务器上)。路由在运行时执行,此时没有任何工件会建议MVC路由处理程序在文件系统特定类所在的位置。因此,路由仅依赖于路由表中路由的顺序(这取决于它们在Global.asax.cs中的顺序)以及URL路径部分如何映射到路由和控制器类名称以及动作。
使方案有效的最简单方法是删除Default
规则并列出根目录下任何控制器的显式规则。
另一种方法是将所有RPC控制器移动到解决方案中的单独区域(区域/ RPC /控制器)。区域的工作方式是任何/rpc/*
路径都映射到RPC区域。这种方法也有一些注意事项,但一般来说它应该有效,因为区域路由在主路径之后注册,而MVC路由尝试避免使用属于URL的区域的控制器映射到该区域。