ASP.Net 使用Area遇到的HomeController歧义问题
当我们的Area区域有一个HomeController控制器,根目录也有一个HomeController控制器的时候,我们访问主页会出现如下问题: 出现这个问题的原因是因为路由系统进行匹配的时候出现了Controller同名的歧义。 当Area被注册的时候,Area中定义的路由被限制了只寻找 Area 中的Controller,所以我们请求 /Admin/Home/Index 时能正常得到 MvcApplication1.Areas.Admin.Controllers 命名空间的 HomeController。然而我们在RouteConfig.cs文件的RegisterRoutes方法中定义的路由并没有类似的限制。
为了解决这个问题,我们需要在RouteConfig.cs文件中定义的路由中加上对应的 namespaces 参数。RouteConfig.cs 中修改后的路由如下:
1 2 3 4 5 6 7 8 9 10 public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }, namespaces: new[] { "你根目录项目的命名空间.Controllers" } ); } 添加了 namespaces 参数后,路由系统在对这个路由进行匹配时,优先匹配指定命名空间的controller,如果匹配到则即刻停止查找,如果在指定的命名空间下没有匹配到对应的controller,再按照一般的方式进行匹配。
生成Area URL的连接 关于Area的URL链接生成,可以分为这么三种情况:第一种是在当前Area生成指向当前Area的链接;第二种是生成指向其他Area的链接;第三种是在某个Area中生成指向根目录的链接。下面是这三种情况生成链接的方法,使用的路由定义是系统默认的。 如果要在Area中生成当前Area的URL链接,直接用下面的方法就行:
1 @Html.ActionLink("Click me", "About") 它根据当前所在的Area和Controller会生成如下Html代码:
1 <a href="/Admin/Home/About">Click me</a> 如果要生成其他Area的URL链接,则需要在Html.