gpt4 book ai didi

c# - 自动将 URL 查询参数键转换为 kebab-case?

转载 作者:行者123 更新时间:2023-12-04 04:05:02 28 4
gpt4 key购买 nike

ASP.NET 默认使用 PascalCase URL 组件,但我想改用 kebab-case。我见过各种articlesSO answers通过 RouteTokenTransformerConvention 在 ASP.NET Core 中优雅地实现这一点(下面的示例代码)。我喜欢这种策略,因为它 1) 确保 kebab-case 路由映射到正确的 Controller 和具有正确路由参数的操作,而无需重复的手动工作;2) 允许您生成匹配的 kebab-case 链接。
但是,它不涉及 URL 查询。 有没有办法获得上述好处,同时在转换中包含查询键? 例如:

  • 我想要一个类似的 URL:some-route?product-category=some+product+category ...
  • 设置ProductCategory绑定(bind)模型的属性到 "some product category"
  • (无需我用 ProductCategory 装饰 [FromQuery(Name="product-category")] 或使用稍微好一点的 idea 或使用其他手动解决方案)

  • 查询值不应该被转换 - 只是键。

  • 这是我从上述链接中获取的代码作为起点:
    连字符.cs
    using Microsoft.AspNetCore.Routing;
    using System.Text.RegularExpressions;

    public class Hyphenator: IOutboundParameterTransformer
    {
    public string TransformOutbound(object value)
    {
    if (value == null)
    {
    return null;
    }
    return Regex.Replace(value.ToString(), "([a-z])([A-Z])", "$1-$2").ToLower();
    }
    }
    启动.cs
    services.AddControllersWithViews(options =>
    {
    options.Conventions.Add(new RouteTokenTransformerConvention(new Hyphenator()));
    });
    编辑澄清:
    我希望有一个解决方案可以在出站方向进行转换(如上面的示例代码),以便除了模型绑定(bind)工作之外,我还可以将常规 PascalCase 属性名称传递给生成 URL 的代码(例如 anchor 标记帮助程序和方法,如 RedirectToRoute() ) 并且这些 URL 中的查询键最终在用户的浏览器中是 kebab-case。这可能吗?

    最佳答案

    我认为字符串操作代码可以提高一些效率。这是一个概念证明。您可以创建一个 url 重写器规则来操作传入的查询字符串。

    public class MyRule : IRule
    {
    public void ApplyRule(RewriteContext context)
    {
    Dictionary<string, StringValues> newQueryCollection = context.HttpContext.Request.Query.ToDictionary(
    kv => ToPascalCase(kv.Key),
    kv => kv.Value
    );

    context.HttpContext.Request.Query = new QueryCollection(newQueryCollection);
    }

    private static string ToPascalCase(string kebabCase)
    {
    return string.Join(string.Empty, kebabCase.Split('-').Select(str => str.Length > 0 ? char.ToUpper(str[0]) + str.Substring(1) : str));
    }
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
    if (env.IsDevelopment())
    {
    app.UseDeveloperExceptionPage();
    }

    var options = new RewriteOptions().Add(new MyRule());
    app.UseRewriter(options);
    app.UseRouting();

    /*
    register other app builder extensions after this point
    */
    }
    如果重写发生在管道的早期,在运行 mvc 中间件之前,则查询字符串参数的更新键将用于绑定(bind)模型。

    关于c# - 自动将 URL 查询参数键转换为 kebab-case?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62664602/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com