如何在每个操作的基础上覆盖 RouteOptions.LowercaseUrls?

Dai*_*Dai 5 routing asp.net-mvc-routing asp.net-core

在我的 ASP.NET Core 2.1 Web 应用程序中,我的 Startup 方法中有这个:

services.Configure<RouteOptions>( o =>
{
    o.LowercaseUrls = true;
} );
Run Code Online (Sandbox Code Playgroud)

对于初学者,此设置会导致UrlHelper以小写形式呈现所有路径组件(但不是查询字符串项)。

例如,给定这个控制器和动作:

public class FooController : Controller
{
    [Route("/FOO/bAR/{baz}")]
    public IActionResult Bar( [FromRoute] String baz, [FromQuery] String qux )
    {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

并给出了这个 Razor 表达式:

@Url.Action( action: nameof(FooController.Bar), new { baz = "Ab", qux = "Ab" } )
Run Code Online (Sandbox Code Playgroud)

有了o.LowercaseUrls = false那么这将呈现:

/FOO/bAR/Ab?qux=Ab
Run Code Online (Sandbox Code Playgroud)

有了o.LowercaseUrls = true那么这将呈现:

/foo/bar/ab?qux=Ab
Run Code Online (Sandbox Code Playgroud)

LowercaseUrls = true对于 90% 的操作,使用是很好的(甚至是首选!),但对于少数 URL,重要的是保留路由参数的大小写(特别是当路由参数是 Base64 编码或 Linux 文件名时- 灵敏度很重要)。

目前唯一的解决方法是将它们转换为查询字符串参数而不是路由参数,但这并不理想。

有什么办法可以用类似[PreserveRouteParameterCasing]或类似的东西注释动作吗?