【问题标题】:.Net core ModelBinding does not Invalidate ModelState for primitive values?.Net 核心 ModelBinding 不会使原始值的 ModelState 无效?
【发布时间】:2020-05-24 17:02:13
【问题描述】:

我正在使用 .Net Core 3。我有一个带有 [ApiController] 属性的控制器。因此,如果模型验证失败,它会自动返回 BadRequest 错误。但是我的模型中有原始值,例如 int、bool,如果我的请求对象中不包含这些值,ApiController 在这种情况下不会产生错误。但是将这些字段初始化为默认值。我希望它产生 BadRequest 错误。我怎样才能做到这一点? 我使这些字段可以为空并且它可以工作,但我不想让它们可以为空。请帮我。谢谢。

编辑:

 public class AddEmployeeReqObject
{
    [Required]
    [JsonPropertyName("casino_id")]
    [Display(Name = "casino_id")]
    public long CasinoId { get; set; }

    [Required]
    [JsonPropertyName("name")]
    [Display(Name = "name")]
    public string Name { get; set; }

    [Required]
    [JsonPropertyName("yubico_key")]
    [Display(Name = "yubico_key")]
    public string YubicoKey { get; set; }

    [Required]
    [JsonPropertyName("is_manager")]
    [Display(Name = "is_manager")]
    public bool IsManager { get; set; }
}

这里IsManager和CasinoId默认初始化为false和0。

【问题讨论】:

  • @pinkfloydx33 是的,他们这样做了,我已经更新了问题。
  • 使它们可以为空是值类型的建议方法

标签: c# asp.net .net asp.net-core .net-core


【解决方案1】:

您应该使用 BindRequiredAttribute 而不是 RequiredAttribute。 RequiredAttribute 非常适用于可空类型,但对于不可空类型则无效。例如,对于 int,默认值为 0,并且该属性永远不能为空。即使客户端提交了一个属性完全缺失的请求,模型实例的值也会为 0。

BindRequiredAttribute 开始行动!

它的工作方式与RequiredAttribute 相同,只是它要求值来自请求——因此它不仅拒绝空值,还拒绝“未绑定”值。

例如访问:https://www.strathweb.com/2017/12/required-and-bindrequired-in-asp-net-core-mvc/

【讨论】:

  • 我试过 BindRequired 但效果不佳。
【解决方案2】:

我不知道为什么你们都为字段设置默认值,但是 也想判断它的默认值为null,并验证为错误。

在验证ModelState.IsValid时,可以判断模型的两个字段是否是你设置的默认值。如果是,则验证失败并返回 BadRequest 错误。

public async Task<IActionResult> Test(AddEmployeeReqObject obj)
    {

        if (ModelState.IsValid && obj.CasinoId != 0 && obj.IsManager)
        {
            return Ok();
        }
        else
        {
            return BadRequest();
        }

    }

【讨论】:

  • 是的,这也是一个选项,但我不想自己做这个验证,这是重点。
  • @honey_ramgarhia,我觉得如果一定要给这些字段赋值默认值,是不可能自动验证为假的。
【解决方案3】:

int 和 bool 变量不能为 null,因此要检查它们,您必须:

  1. 使它们可以为空并测试它们是否为空 或
  2. 将 bool 字段设置为 true(预先选中复选框或某事)并将 int 设置为负值

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-28
    • 2017-12-17
    • 2016-11-03
    • 1970-01-01
    • 2018-06-30
    • 2011-02-09
    • 1970-01-01
    相关资源
    最近更新 更多