Enum 模型绑定 [FromRoute] 的行为与 .net core 中的 [FromBody] 不同

问题描述 投票:0回答:2

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

我有一个 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)

我想接收该值,即使它超出枚举中的编码限制。

c# enums asp.net-core-webapi model-binding
2个回答
0
投票

.net core 2.1之后选项SuppressBindingUndefinedValueToEnumType的默认值为true。所以你需要像下面这样改变:

services.AddMvc(opt=>
          opt.SuppressBindingUndefinedValueToEnumType=false)
.SetCompatibilityVersion(CompatibilityVersion.Version_2_2); 

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


0
投票

Eduardo 的回答中所述,选项允许接受未定义的

int
枚举绑定值。

但这个选项在 .net core 3 中已被抑制,别无选择,除了放弃绑定到 enum,而是绑定到 int 然后强制转换。

参见https://github.com/dotnet/aspnetcore/issues/14824

© www.soinside.com 2019 - 2024. All rights reserved.