【问题标题】:Enum model binding [FromRoute] behaves differently than [FromBody] in .net core枚举模型绑定 [FromRoute] 的行为与 .net 核心中的 [FromBody] 不同
【发布时间】:2019-08-13 18:14:27
【问题描述】:

我在带有枚举的 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)

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

【问题讨论】:

    标签: c# enums asp.net-core-webapi model-binding


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-08-03
      • 1970-01-01
      • 2017-10-03
      • 2017-09-30
      • 2016-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多