Для этого вы можете использовать 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;
}
}
Если в строке запроса запроса не найден соответствующий параметр, он вернет false из метода Accept.
Than create 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/