您可以为此使用IActionConstraint 和IParameterModelConvention 接口。简而言之,像这样创建一个 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/