我正在寻找一种自动连接CamelCase动作和视图的方法.也就是说,我希望我不必实际重命名我的视图或向网站中的每个ActionResult添加装饰器.
到目前为止,我一直在使用routes.MapRouteLowercase,如here所示.这对于URL结构的小写方面非常有效,但不是连字符.所以我最近开始玩Canonicalize(通过NuGet安装),但它也没有任何连字符.
我在努力……
routes.Canonicalize().NoWww().Pattern(“([a-z0-9])([A-Z])”,“$1- $2”).小写().NoTrailingSlash();
我的正则表达式肯定会按照我希望的方式正常工作,以便正确地重构URL,但当然不会识别这些URL.例如,该文件仍然是ChangePassword.cshtml,因此/ account / change-password不会指向该文件.
顺便说一句,我对.NET MVC仍然有点生疏.我没有使用它几年而不是从v2.0开始.
解决方法
这可能有点混乱,但如果您创建了自定义
HttpHandler和
RouteHandler,则应该可以防止您重命名所有视图和操作.您的处理程序可以从请求的操作中删除连字符,这会将“change-password”更改为changepassword,从而呈现ChangePassword操作.
为简洁起见,缩短了代码,但重要的部分就在那里.
public void ProcessRequest(HttpContext context) { string controllerId = this.requestContext.RouteData.GetrequiredString("controller"); string view = this.requestContext.RouteData.GetrequiredString("action"); view = view.Replace("-",""); this.requestContext.RouteData.Values["action"] = view; IController controller = null; IControllerFactory factory = null; try { factory = ControllerBuilder.Current.GetControllerFactory(); controller = factory.CreateController(this.requestContext,controllerId); if (controller != null) { controller.Execute(this.requestContext); } } finally { factory.ReleaseController(controller); } }
我不知道我是否以最好的方式实现它,这或多或少取自我遇到的第一个sample.我自己测试了代码,所以这确实呈现了正确的操作/视图,应该可以解决问题.