有一个简单的方法可以让MvcRouteHandler将传入URL的动作和控制器部分中的所有连字符转换为下划线,因为方法或类名中不支持连字符。
这将是我可以支持这样的结构,如sample.com/test-page/edit-details映射到Action edit_details和controller test_pagecontroller,同时继续使用MapRoute方法。
我知道我可以指定一个动作名称属性和支持连字符在控制器名称,手动添加路由实现这,但我正在寻找一个自动化的方式,以便在添加新的控制器和操作时保存错误。
解决方法
C#版本的约翰的帖子任何人谁喜欢它:
C# and VB version on my blog
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); } }
…和新路线:
routes.Add( new Route("{controller}/{action}/{id}",new RouteValueDictionary( new { controller = "Default",action = "Index",id = "" }),new HyphenatedRouteHandler()) );
你可以使用下面的方法,但要记住,你需要命名视图My-Action,如果你喜欢让visual studio自动生成你的视图文件,这可能很讨厌。
[ActionName("My-Action")] public ActionResult MyAction() { return View(); }