我正在创建一个具有3个参数的端点。在路径中需要一个参数。其他2个参数是查询参数,至少需要提供其中一个。不确定如何在.NET核心中执行此操作。
[HttpGet("{source}")]
public ActionResult<IEnumerable<string>> Get(
string source,
[FromQuery] string year,
[FromQuery] string genre)
{
}
我看到了模型绑定。我需要建立模型并进行模型验证吗?我显然可以向控制器添加自定义逻辑来进行检查,但是我感觉有更好的方法来处理此问题。
答案 0 :(得分:0)
检查可选参数并进行相应验证
[HttpGet("{source}")]
public ActionResult<IEnumerable<string>> Get(
string source,
[FromQuery] string year,
[FromQuery] string genre) {
if(string.IsNullOrEmpty(year) && string.IsNullOrEmpty(genre))
return BadRequest();
//...
}
否则,您将需要一个自定义过滤器来检查查询字符串
[ProducesResponseType(400)]
public class ValidateQueryStringStateAttribute : ActionFilterAttribute {
public override void OnActionExecuting(ActionExecutingContext context) {
var query = context.Request.Query;
if(!query.ContainsKey("year") && !query.ContainsKey("genre"))
context.ModelState.AddModelError("", "At least year or genre required");
if (!context.ModelState.IsValid) {
var result = new Dictionary<string, string>();
foreach (var key in context.ModelState.Keys) {
result.Add(key, String.Join(", ", context.ModelState[key].Errors.Select(p => p.ErrorMessage)));
}
// 400 - Bad Request
context.Result = new ObjectResult(result) { StatusCode = 400 };
}
}
}
并用于操作
[HttpGet("{source}")]
[ValidateQueryStringState]
public ActionResult<IEnumerable<string>> Get(
string source,
[FromQuery] string year,
[FromQuery] string genre) {
//...
}