ASP.NET MVC中默认特性路由无法正常工作的问题
ASP.NET MVC特性路由默认路由不生效问题解决
问题描述
我在ASP.NET MVC应用中尝试使用特性路由,已为所有Action方法添加路由特性及HTTP动词特性,但无法设置默认路由。手动在URL中输入路由地址可正常访问,但应用启动时默认不会跳转至该路由。我已使用空的[Route("")]特性来标记默认路由。
控制器代码
namespace WebApplication2.Controllers { [RoutePrefix("myproject")] public class AttributerouteController : Controller { // GET: Attributeroute [HttpGet] [Route("")] public ActionResult Employees() { return View(); } [HttpGet] [Route("Employees/{id}")] public ActionResult Employeebyid(int id) { return View(); } [HttpGet] [Route("Employees/{id}/department")] public ActionResult Empdepartment(int id) { return View(); } } }
RouteConfig.cs代码
public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapMvcAttributeRoutes(); //routes.RouteExistingFiles = true; routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Attributeroute", action = "Employees", id = UrlParameter.Optional } ); }
解决方法
问题核心是传统默认路由与特性路由的前缀不匹配:控制器设置了[RoutePrefix("myproject")],所以特性路由的默认地址是/myproject,但应用启动时默认匹配的是传统路由的{controller}/{action}/{id}模板,两者路径不一致导致无法自动跳转。
提供两种可行方案:
方案一:修改传统默认路由的URL模板
调整RouteConfig.cs中的默认路由,让其URL直接匹配特性路由的前缀:
public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapMvcAttributeRoutes(); //routes.RouteExistingFiles = true; routes.MapRoute( name: "Default", url: "myproject", // 匹配特性路由的前缀路径 defaults: new { controller = "Attributeroute", action = "Employees", id = UrlParameter.Optional } ); }
修改后,应用启动时会自动匹配/myproject路径,跳转到对应的Employees Action。
方案二:为默认Action添加根路径路由特性
在Employees方法上额外添加[Route("~/")]特性,让它同时匹配根路径/和特性路由的/myproject:
[HttpGet] [Route("")] // 匹配/myproject [Route("~/")] // 匹配根路径/ public ActionResult Employees() { return View(); }
这种方式无需修改传统路由配置,访问根路径时会直接触发该Action,同时保留原有的/myproject访问路径。
推荐方案一,更贴合特性路由的设计逻辑,避免路由规则重复。
内容的提问来源于stack exchange,提问作者Srikanth Reddy
相关产品推荐
相关产品推荐

