我在带有枚举的绑定模型中得到不同的行为,并且在传递超出枚举限制的信息时无法获得正确的值。
我有一个 TestEnum 枚举,其中包含 Test1 = 1、Test2 = 2、Test3 = 3。
在
[HttpPost]
或 [HttpPut]
中使用 [FromBody]
,我的 DTO 对象正确接收枚举值,即使我传递不同的值(例如 5)。
但是,在使用
[FromRoute]
的 Get/Put 中,当输入的值在枚举限制(1、2 或 3)内时,我的 DTO 对象会正确接收枚举。
如果我通过了 5,则枚举器的值变为零,这与
[FromBody]
不同,即使它在编码的 Test1、Test2 和 Test3 之外,也可以正常接收值 5。
public enum TestEnum
{
Test1 = 1,
Test2 = 2,
Test3 = 3
}
即使超出枚举限制,它也能完美接收值。
[HttpPost]
public async Task<ActionResult<NotificationResult>> Post([FromBody]TestCommand command)
这里,在
[FromRoute]
和 [FromBody]
中,当值在枚举边界内时,它们会被完美接收。
超出范围时,
[FromRoute]
变为 0,[FromBody]
变为 5。
[HttpPut("{id:int}")]
public async Task<ActionResult<NotificationResult>> Put([FromRoute]TestEnum id, [FromBody]TestCommand command)
在这里,在
[FromRoute]
中,当值在枚举边界内时,它们会被完美接收。
超出范围时,
[FromRoute]
变为零。
[HttpGet("{id:int}")]
public async Task<ActionResult<TestQueryResult>> GetById([FromRoute]TestEnum id)
我想接收该值,即使它超出枚举中的编码限制。
.net core 2.1之后选项SuppressBindingUndefinedValueToEnumType的默认值为true。所以你需要像下面这样改变:
services.AddMvc(opt=>
opt.SuppressBindingUndefinedValueToEnumType=false)
.SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
问题解决了。 现在可以了。