我正在寻找一种自动连接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.我自己测试了代码,所以这确实呈现了正确的操作/视图,应该可以解决问题.
原文地址:https://www.jb51.cc/aspnet/251775.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。