枚举模型绑定 [FromRoute] 的行为不同于 .net core 中的 [FromBody]

Enum model binding [FromRoute] behaves differently than [FromBody] in .net core

我在带有枚举的 bindind 模型中得到了不同的行为,并且在传递超出枚举限制的信息时我无法获得正确的值。

我有一个包含 Test1 = 1、Test2 = 2、Test3 = 3 的 TestEnum 枚举。

在使用 [FromBody][HttpPost][HttpPut] 中,我的 DTO 对象正确接收枚举值,即使我传递了一个不同的值,例如 5。

但是,在使用 [FromRoute] 的 Get/Put 中,当输入的值在枚举限制(1、2 或 3)内时,我的 DTO 对象正确接收枚举。

如果我传递 5,枚举器的值变为零,不像 [FromBody] 可以正常接收值 5,即使它在编码的 Test1、Test2 和 Test3 之外。

public enum TestEnum
{
   Test1 = 1,
   Test2 = 2,
   Test3 = 3
}

即使超出枚举限制,它也能完美接收值。

[HttpPost]
public async Task<ActionResult<NotificationResult>> Post([FromBody]TestCommand command)

这里,在[FromRoute][FromBody]中,当值在枚举边界内时,它们会被完美接收。

超出范围时,[FromRoute] 为零,[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); 

问题已解决。 现在可以了。