微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

asp.net-mvc-routing – 在.NET MVC 4.0 URL结构中强制使用连字符

我正在寻找一种自动连接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开始.

解决方法

这可能有点混乱,但如果您创建了自定义 HttpHandlerRouteHandler,则应该可以防止您重命名所有视图和操作.您的处理程序可以从请求的操作中删除连字符,这会将“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 举报,一经查实,本站将立刻删除。

相关推荐