属性路由不在区域工作

场景:我在ASP.NET MVC 5站点中有一个Forms区域。

我正尝试redirect到使用新的“属性路由”function定义的自定义路由的“详细信息操作”。

RedirectToAction:

return RedirectToAction("Details", new { slug }); 

我正在redirect到的操作:

 [HttpGet] [Route("forms/{slug}")] public ActionResult Details(string slug) { var form = FormRepository.Get(slug); ... return View(model); } 

我希望redirect到http://localhost/forms/my-slug ,而是应用程序将我redirect到http://localhost/Forms/Details?slug=my-slug

这意味着属性路由不起作用。

这怎么解决?

我已经添加了routes.MapMvcAttributeRoutes(); 行到我的RouteConfig:

 public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapMvcAttributeRoutes(); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); } } 

这是我的Application_Start():

 protected void Application_Start() { AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); } 

您可能将基于约定的路由与属性路由相结合,并且您应该在映射属性路由之后注册您的区域

该线

 AreaRegistration.RegisterAllAreas(); 

应该在这行后面叫:

 routes.MapMvcAttributeRoutes(); 

解释(来自http://blogs.msdn.com/b/webdev/archive/2013/10/17/attribute-routing-in-asp-net-mvc-5.aspx#route-areas ):

如果同时使用具有路由属性的区域和具有基于约定的路由的区域(由AreaRegistration类设置),则需要确保在configuration了MVC属性路由之后发生区域注册,但是在基于默认约定的路由组。 原因是路由注册应该从最具体的(属性)通过更一般的(区域注册)到雾通用(默认路由)来sorting,以避免通用路由“过早地”匹配到来的请求来“隐藏”更具体的路由pipe道。

当您创build一个空白的asp.net mvc网站,添加一个区域,并开始使用属性路由,你会遇到这个问题,因为Visual Studio中的“添加区域”动作在你的Application_Start中添加RegisterAllAreas调用,在路由configuration之前。

替代scheme

也许你不打算继续使用基于约定的路由,而只是使用属性路由。 在这种情况下,您可以删除FormsAreaRegistration.cs文件。

将AreaRegistration.RegisterAllAreas()移到RouteConfig.cs对我来说是不够的。 我还需要为RouteArea属性使用AreaPrefix参数:

 //Use the named parameter "AreaPrefix" [RouteArea("AreaName", AreaPrefix = "area-name-in-url")] [RoutePrefix("controller-name-in-url")] public class SampleController : Controller { [Route("{actionParameter}")] public ActionResult Index(string actionParameter) { return View(); } } 

编辑:在某个时候,我遇到了一个来自微软的示例解决scheme,很好地展示了如何处理属性路由。 它还展示了如何将SelectList转换为input[type="radio"] array input[type="radio"]项目的数组,以及如何使用input[type="checkbox"]项目(如果我记得)的数组。 这个示例解决scheme可能是对这个问题的更好的回答 – 以及给出一些关于显示单选button和checkbox项目的很好的例子。 如果有人知道这个示例解决scheme,请添加一个带有链接的评论。