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.我自己测试了代码,所以这确实呈现了正确的操作/视图,应该可以解决问题.

相关文章

### 创建一个gRPC服务项目(grpc服务端)和一个 webapi项目(...
一、SiganlR 使用的协议类型 1.websocket即时通讯协议 2.Ser...
.Net 6 WebApi 项目 在Linux系统上 打包成Docker镜像,发布为...
一、 PD简介PowerDesigner 是一个集所有现代建模技术于一身的...
一、存储过程 存储过程就像数据库中运行的方法(函数) 优点:...
一、Ueditor的下载 1、百度编辑器下载地址:http://ueditor....