【问题标题】:allow hyphens in URLs for asp.net mvc 2 controller names允许在 asp.net mvc 2 控制器名称的 URL 中使用连字符
【发布时间】:2011-07-13 23:31:19
【问题描述】:
[ActionName("about-us")]
public ActionResult EditDetails(int id)
{
// your code
}
上述操作适用于操作,但我希望能够对控制器执行相同(或类似)操作,即 URL 名称中也有连字符。有没有简单的方法来实现这一点(我尝试了 ActionName 属性但没有运气)
【问题讨论】:
标签:
asp.net-mvc
asp.net-mvc-2
asp.net-mvc-routing
asp.net-mvc-controller
【解决方案1】:
最简单的方法是添加自定义路线:
routes.MapRoute("RouteName", "controler-name/{action}/{id}", new { controller = "ControllerName", action = "Index", id = "" });
我以前没有见过这样的控制器名称属性,尽管它可能是可能的。
【解决方案2】:
也许这行得通:
public class CustomControllerFactory : DefaultControllerFactory {
protected override Type GetControllerType(RequestContext requestContext, string controllerName) {
return base.GetControllerType(requestContext, controllerName.Replace("-", ""));
}
}
【解决方案3】:
您可以使用自定义路由处理程序来为您提供所需的功能:
public class HyphenatedRouteHandler : MvcRouteHandler
{
protected override IHttpHandler GetHttpHandler(RequestContext requestContext)
{
requestContext.RouteData.Values["controller"] = requestContext.RouteData.Values["controller"].ToString().Replace("-", "_");
requestContext.RouteData.Values["action"] = requestContext.RouteData.Values["action"].ToString().Replace("-", "_");
return base.GetHttpHandler(requestContext);
}
}
并且应该使用该处理程序注册路由:
var route = routes.MapRoute(
"Some Action",
"{controller}/{action}/{id}"
);
route.RouteHandler = new HyphenatedRouteHandler();
这里有一个类似的问题:ASP.net MVC support for URL's with hyphens
【解决方案4】:
路由表中的连字符路由应该在默认路由之前。
routes.MapRoute(
"InformationAbout",
"information-about/{action}/{id}",
new { controller = "InformationAbout", action = "Index", id = "" }
);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional }