【发布时间】:2019-09-16 01:01:51
【问题描述】:
我有一个如下所示的 WebAPI 控制器:
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
[HttpGet]
public ActionResult<string> Get([FromQuery]DataFilter dataFilter)
{
return string.Join(Environment.NewLine, dataFilter?.Filter?.Select(f => f.ToString()) ?? Enumerable.Empty<string>());
}
}
没什么特别的,只是一个控制器,它从查询字符串中接收一些数据并将其作为响应输出。 它接收的类如下所示:
public class DataFilter
{
public IEnumerable<FilterType> Filter { get; set; }
}
public enum FilterType
{
One,
Two,
Three,
}
这些只是用于说明问题的示例类,当尝试像这样调用此方法时,这是一个验证错误:
/api/values?filter=
然后回应:
{
"errors": {
"Filter": [
"The value '' is invalid."
]
},
"title": "One or more validation errors occurred.",
"status": 400,
"traceId": "80000164-0002-fa00-b63f-84710c7967bb"
}
如果我将我的 FilterType 设置为可为空,它可以工作,但在这种情况下,数组只包含空值。如果这样使用:
/api/values?filter=&filter=&filter=
它将只包含 3 个空值。而且我希望它只是空或 null,因为没有传递任何实际值。
ASP .Net Core github 帐户包含一些类似的问题,但据报道它们已在我正在使用的 2.2 中修复。但也许他们是不同的,或者我误解了一些东西。
EDIT_0: 只是为了说明我所说的可为空的意思。
如果我把我的班级改成这样:
public IEnumerable<FilterType?> Filter { get; set; } //notice that nullable is added to an Enum, not the list
然后当这样调用时:
/api/values?filter=&filter=&filter=
我的“过滤器”属性中有 3 个元素。所有空值。不完全是我所期望的。 很好的解决方法,但根本不是解决方案。
【问题讨论】:
-
你可以不指定查询字符串参数吗:即:命中
/api/values? -
那将是最简单的解决方案,但不幸的是没有。我必须确保 API 在这种情况下有效。
-
那么问题出在哪里?如果您使参数可以为空,则一切正常,正如您提到的那样,这是正确的行为。我就是不明白这是什么问题?
-
对有关您的评论的问题添加了一些解释。
标签: c# asp.net-core json.net asp.net-core-2.2