Asp.Net 核心 [FromRoute] 自动 url 解码

Asp.Net Core [FromRoute] auto url decode

如果我们在 Asp.Net 核心中有这样的控制器端点:

[HttpGet("/api/resources/{someParam}")]
public async Task<ActionResult> TestEndpoint([FromRoute] string someParam)
{
    string someParamUrlDecoded = HttpUtility.UrlDecode(someParam);
    // do stuff with url decoded param...
}

是否有某种方法可以配置 [FromRoute] 解析行为,使其注入 someParam 已经 url 解码的值?

实现您想要做的任何事情的一种方法是创建自定义属性。在属性中,您基本上可以拦截传入的参数并执行您需要的任何操作。

属性定义:

public class DecodeQueryParamAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        string param = context.ActionArguments["param"] as string;
        context.ActionArguments["param"] = "Blah"; // this is where your logic is going to sit
        base.OnActionExecuting(context);
    }
}

并且在控制器中,您需要使用属性来修饰操作方法,如下所示。路线可根据需要修改。

[HttpGet("/{param}")]
[Attributes.DecodeQueryParamAttribute]
public void Process([FromRoute] string param)
{
    // value of param here is 'Blah'
    // Action method
}

请注意,当您要将编码字符串作为查询字符串参数传递时,您可能需要检查是否允许 Double Escaping 及其含义。