【问题标题】:Route to controller based on query string根据查询字符串路由到控制器
【发布时间】:2018-12-04 20:17:35
【问题描述】:

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

是否可以根据查询字符串将控制器设置为路由?我试过了

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

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

感谢您的帮助!

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

public IActionResult Index(){}

public IActionResult Index([FromQuery]string query){}

路由似乎无法区分这两者。

【问题讨论】:

    标签: asp.net-core


    【解决方案1】:

    您可以为此使用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;
        }
    }
    

    如果在请求的查询字符串中没有找到匹配的参数,那么它将从 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));
            }
        }
    }
    

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-20
      • 2015-04-12
      • 2017-06-26
      • 1970-01-01
      • 1970-01-01
      • 2022-01-16
      • 2016-07-06
      • 1970-01-01
      相关资源
      最近更新 更多