根据查询字符串路由到控制器

Ste*_*eve 3 asp.net-core

问题:我们正在从旧系统升级,因此解决方案受到限制。如果存在特定的查询字符串,我正在尝试路由到未经授权的控制器。如果不存在,则将用户路由到授权控制器。这是在 ASP.Net Core 2.1 上。

是否可以将控制器设置为基于查询字符串进行路由?我试过了

[/home/[action]?query={query}] -> 由于“?”导致运行时错误

[/home/[action]/{query}] - > 映射到 /home/index/1 (不是我需要的)

谢谢你的帮助!

编辑:或者,是否可以有一个单独的控制器 Action 取决于查询参数?

public IActionResult Index(){}

public IActionResult Index([FromQuery]string query){}
Run Code Online (Sandbox Code Playgroud)

路由似乎没有区分这两者。

xxx*_*tko 7

您可以为此使用IActionConstraintIParameterModelConvention接口。简而言之,像这样创建一个 IActionConstraint:

public class RequiredFromQueryActionConstraint : IActionConstraint
{
    private readonly string _parameter;

    public RequiredFromQueryActionConstraint(string parameter)
    {
        _parameter = parameter;
    }

    public int Order => 999;

    public bool Accept(ActionConstraintContext context)
    {
        if (!context.RouteContext.HttpContext.Request.Query.ContainsKey(_parameter))
        {
            return false;
        }

        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果在请求的查询字符串中没有找到匹配的参数,那么它将从 Accept 方法返回 false。

比创建这样的RequiredFromQueryAttribute类:

public class RequiredFromQueryAttribute : FromQueryAttribute, IParameterModelConvention
{
    public void Apply(ParameterModel parameter)
    {
        if (parameter.Action.Selectors != null && parameter.Action.Selectors.Any())
        {
            parameter.Action.Selectors.Last().ActionConstraints.Add(new RequiredFromQueryActionConstraint(parameter.BindingInfo?.BinderModelName ?? parameter.ParameterName));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

比你可以用这个属性装饰你的强制性查询字符串参数:

[Route("api/[controller]")]
public class ValuesController : Controller
{
    [HttpGet("{id}")]
    public string Get(int id, [RequiredFromQuery]string foo, [RequiredFromQuery]string bar)
    {
        return id + " " + foo + " " + bar;
    }
}
Run Code Online (Sandbox Code Playgroud)

从现在开始,只有以下 URL GETapi/values/5?foo=a&bar=b将导致上述操作,所有其他参数组合将导致响应 status 404,您最终可以将其替换为您想要的。

您可以在此链接中找到更多信息https://www.strathweb.com/2016/09/required-query-string-parameters-in-asp-net-core-mvc/