ASP.NET Core [要求] 不可为 null 的类型

2024-05-01

Here https://stackoverflow.com/questions/6662976/required-attribute-for-an-integer-value,提出了如何验证不可为空的必需类型的问题。

在我的情况下,提供的使字段可为空的解决方案如下所示是不可取的。

[Required]
public int? Data { get; set; }

在请求中省略该字段的情况下,如何更改行为以使以下验证失败。

[Required]
public int Data { get; set; }

我尝试过自定义验证器,但这些验证器没有有关原始值的信息,只能看到默认值0价值。我也尝试过自定义模型绑定器,但它似乎在整个请求模型的级别上工作,而不是在需要的整数字段级别上工作。我的活页夹实验如下所示:

public class RequiredIntBinder : IModelBinder
{
    public Task BindModelAsync(ModelBindingContext bindingContext)
    {
        if (bindingContext.ModelType != typeof(int))
            throw new InvalidOperationException($"{nameof(RequiredIntBinder)} can only be applied to integer properties");

        var value = bindingContext.ValueProvider.GetValue(bindingContext.BinderModelName);
        if (value == ValueProviderResult.None)
        {
            bindingContext.Result = ModelBindingResult.Failed();
            return Task.CompletedTask;
        }

        return new SimpleTypeModelBinder(bindingContext.ModelType).BindModelAsync(bindingContext);
    }
}

public class RequiredIntBinderProvider : IModelBinderProvider
{
    public IModelBinder GetBinder(ModelBinderProviderContext context)
    {
        if (context == null)
        {
            throw new ArgumentNullException(nameof(context));
        }

        if (context.Metadata.ModelType == typeof(int))
        {
            return new BinderTypeModelBinder(typeof(RequiredIntBinder));
        }

        return null;
    }
}

并像这样向 mvc 注册

options.ModelBinderProviders.Insert(0, new RequiredIntBinderProvider());

但模型绑定器从未被使用过。我觉得我可能很接近,但无法连接最后的点。


使用 json 请求的解决方案

You 无法验证已创建的模型实例,因为不可为 null 的属性始终具有一个值(无论它是从 json 分配还是默认值)。这解决方案是在反序列化期间报告缺失值.

创建合约解析器

public class RequiredPropertiesContractResolver : DefaultContractResolver
{
    protected override JsonObjectContract CreateObjectContract(Type objectType)
    {
        var contract = base.CreateObjectContract(objectType);

        foreach (var contractProperty in contract.Properties)
        {
            if (contractProperty.PropertyType.IsValueType
                && contractProperty.AttributeProvider.GetAttributes(typeof(RequiredAttribute), inherit: true).Any())
            {
                contractProperty.Required = Required.Always;
            }
        }

        return contract;
    }
}

然后将其分配给SerializerSettings:

services.AddMvc()
        .AddJsonOptions(jsonOptions =>
        {
            jsonOptions.SerializerSettings.ContractResolver = new RequiredPropertiesContractResolver();
        });

The ModelState那么对于不可为 null 的属性无效[Required]属性(如果 json 中缺少该值)。


Example

json体

var jsonBody = @"{ Data2=123 }"

对于型号无效

class Model
{
    [Required]
    public int Data { get; set; }

    public int Data2 { get; set; }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ASP.NET Core [要求] 不可为 null 的类型 的相关文章

  • 属性对象什么时候创建?

    由于属性实际上只是附加到程序集的元数据 这是否意味着属性对象仅根据请求创建 例如当您调用 GetCustomAttributes 时 或者它们是在创建对象时创建的 或者 前两个的组合 在由于 CLR 的属性扫描而创建对象时创建 从 CLR
  • 如何在 Unity 中从 RenderTexture 访问原始数据

    问题的简短版本 我正在尝试访问 Unity 中 RenderTexture 的内容 我一直在使用 Graphics Blit 使用自己的材质进行绘制 Graphics Blit null renderTexture material 我的材
  • 模板类的不明确多重继承

    我有一个真实的情况 可以总结为以下示例 template lt typename ListenerType gt struct Notifier void add listener ListenerType struct TimeListe
  • C++ 求二维数组每一行的最大值

    我已经设法用这个找到我的二维数组的每一行的最小值 void findLowest int A Cm int n int m int min A 0 0 for int i 0 i lt n i for int j 0 j lt m j if
  • 如何在没有 Control.Invoke() 的情况下从后台线程修改控件属性

    最近 我们遇到了一些旧版 WinForms 应用程序 我们需要更新一些新功能 在专家测试该应用程序时 发现一些旧功能被破坏 无效的跨线程操作 现在 在您认为我是新手之前 我确实有一些 Windows 窗体应用程序的经验 我不是专家 但我认为
  • fgets() 和 Ctrl+D,三次才能结束?

    I don t understand why I need press Ctrl D for three times to send the EOF In addition if I press Enter then it only too
  • Cygwin 下使用 CMake 编译库

    我一直在尝试使用 CMake 来编译 TinyXML 作为一种迷你项目 尝试学习 CMake 作为补充 我试图将其编译成动态库并自行安装 以便它可以工作 到目前为止 我已经设法编译和安装它 但它编译成 dll 和 dll a 让它工作的唯一
  • C# 中值类型和引用类型有什么区别? [复制]

    这个问题在这里已经有答案了 我知道一些差异 值类型存储在堆栈上 而引用类型存储在托管堆上 值类型变量直接包含它们的值 而引用变量仅包含对托管堆上创建的对象位置的引用 我错过了任何其他区别吗 如果是的话 它们是什么 请阅读 堆栈是一个实现细节
  • 使用 Google Analytics API 在 C# 中显示信息

    我一整天都在寻找一个好的解决方案 但谷歌发展得太快了 我找不到有效的解决方案 我想做的是 我有一个 Web 应用程序 它有一个管理部分 用户需要登录才能查看信息 在本节中 我想显示来自 GA 的一些数据 例如某些特定网址的综合浏览量 因为我
  • laravel 5.4 在请求验证之前修改数据[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我有我的自定义请求 它扩展了 Backpack CrudController 现在我想重写 ValidatesWhenResolv
  • 我的 strlcpy 版本

    海湾合作委员会 4 4 4 c89 我的程序做了很多字符串处理 我不想使用 strncpy 因为它不会终止 我不能使用 strlcpy 因为它不可移植 只是几个问题 我怎样才能让我的函数正常运行 以确保它完全安全稳定 单元测试 这对于生产来
  • 网络参考共享类

    我用 Java 编写了一些 SOAP Web 服务 在 JBoss 5 1 上运行 其中两个共享一个类 AddressTO Web 服务在我的 ApplycationServer 上正确部署 一切都很顺利 直到我尝试在我的 C 客户端中使用
  • C 中的位移位

    如果与有符号整数对应的位模式右移 则 1 vacant bit will be filled by the sign bit 2 vacant bit will be filled by 0 3 The outcome is impleme
  • 可空属性与可空局部变量

    我对以下行为感到困惑Nullable types class TestClass public int value 0 TestClass test new TestClass Now Nullable GetUnderlyingType
  • 已过时 - OpenCV 的错误模式

    我正在使用 OpenCV 1 进行一些图像处理 并且对 cvSetErrMode 函数 它是 CxCore 的一部分 感到困惑 OpenCV 具有三种错误模式 叶 调用错误处理程序后 程序终止 Parent 程序没有终止 但错误处理程序被调
  • 如何在内存中存储分子?

    我想将分子存储在内存中 这些可以是简单的分子 Methane CH4 C H bond length 108 7 pm H H angle 109 degrees But also more complex molecules like p
  • ListDictionary 类是否有通用替代方案?

    我正在查看一些示例代码 其中他们使用了ListDictionary对象来存储少量数据 大约 5 10 个对象左右 但这个数字可能会随着时间的推移而改变 我使用此类的唯一问题是 与我所做的其他所有事情不同 它不是通用的 这意味着 如果我在这里
  • 方法参数内的变量赋值

    我刚刚发现 通过发现错误 你可以这样做 string s 3 int i int TryParse s hello out i returns false 使用赋值的返回值是否合法 Obviously i is but is this th
  • 为什么 strtok 会导致分段错误?

    为什么下面的代码给出了Seg 最后一行有问题吗 char m ReadName printf nRead String s n m Writes OK char token token strtok m 如前所述 读取字符串打印没有问题 但
  • 不同类型的指针可以互相分配吗?

    考虑到 T1 p1 T2 p2 我们可以将 p1 分配给 p2 或反之亦然吗 如果是这样 是否可以不使用强制转换来完成 或者我们必须使用强制转换 首先 让我们考虑不进行强制转换的分配 C 2018 6 5 16 1 1 列出了简单赋值的约束

随机推荐

  • NativeScript中有本地存储吗?

    如何保持 NativeScript 应用程序中的数据持久化 谁能告诉一下localStorage in NativeScript 编辑 正在寻找localStorage当时 您的问题可以通过多种方式来解读 这使得给您一个好的答案有点困难 但
  • Scheme/Lisp 嵌套循环和递归

    我正在尝试解决方案中的一个问题 该问题要求我使用嵌套循环或嵌套递归 例如我有两个列表 我必须检查它们的笛卡尔积的条件 解决这些类型问题的最佳方法是什么 有关如何简化这些类型的函数的任何指示吗 I ll elaborate a bit sin
  • C# 中类实例的内存使用情况[重复]

    这个问题在这里已经有答案了 可能的重复 C NET 对象使用多少内存 https stackoverflow com questions 426396 how much memory does a c net object use 就像标题
  • 将文件读入 Perl 中的变量 [重复]

    这个问题在这里已经有答案了 可能的重复 在 Perl 中将文件转换为字符串的最佳方法是什么 https stackoverflow com questions 206661 what is the best way to slurp a f
  • jquery是如何实现$(document).ready()的?

    jquery是如何实现的 document ready 当然我可以阅读代码 但我正在寻找这个概念 概念 jQuery ready http api jquery com ready 虽然 JavaScript 提供了在渲染页面时执行代码的
  • C# '+=' 运算符

    我有一些包含运算符 的代码 具体来说 代码如下 foreach KeyValuePair
  • 在 Google Analytics 中跟踪添加到主屏幕 Web 应用程序

    我有一个移动网络应用程序 其 添加到主屏幕 功能运行良好 我正在尝试确定如何使用 Google Analytics 来最好地跟踪已将应用程序安装到主屏幕的用户的应用程序使用情况 似乎没有默认方法可以在分析中查看应用程序是否处于独立模式 Go
  • css 中的嵌套边框布局?

    我这个工作正常 http jsfiddle net uwcEw http jsfiddle net uwcEw CSS 上的传统边框布局 我想要做的是在边框布局的 中间 内有另一个 5 区域边框布局 重新应用上面相同的模式我得到这个 htt
  • 使用 Angular 将井号作为 URL 查询字符串中的值传递

    我有一个输入标签 在输入时它将根据输入值过滤表中的数据列表 该值通过请求 URL 中的查询字符串传递 通常我会得到返回的数据并且表会被适当更新 但是 当搜索井号 时 我收到 500 内部服务器错误 我的问题是 在查询字符串中传递井号时 An
  • Bigtable数据库设计理论

    我非常精通关系数据库设计的理论和实践 我知道什么有效 什么无效 什么是高性能的 什么是可维护的 几乎 当您开始拥有真实数据时 总是有需要调整的地方 看来我找不到关于分布式可扩展数据库的大量知识 例如 Google 的 Bigtable 用于
  • MATLAB 图像锐化 - 使用(1-高斯低通滤波器)的高斯高通滤波器

    我试图通过设计高斯高通滤波器来锐化图像 我想利用高通滤波器相当于单位矩阵减去低通滤波器的事实来做到这一点 所以我执行了以下操作 image imread Question3 Data Cats jpg read image H 1 fspe
  • 在 sendmultiple 上使用 dropzone.js 发送 formData

    dropzone js 文档 wiki 没有说明如何发送表单字段 我刚刚读到表单数据对象 https developer mozilla org en US docs Web API FormData FormData它说明了如何使用表单字
  • 不同元素类型的名称属性的 jQuery 选择器

    我有一个行表 在其中一列中 某些行具有包含静态文本的跨度 某些行具有可供选择的值的选择 该一列中的所有元素都具有相同的名称属性 在我的表单提交中 我遍历行并希望获取所有列的值 我希望有一个 jQuery 选择器语句来从该元素获取值 span
  • Django ModelForm 不保存数据

    我已经尝试过以下帖子中的解决方案 从 ModelForm 保存数据 https stackoverflow com questions 13046488 saving data from modelform 没起作用 ModelForm数据
  • 识别 IR 中的阵列类型

    我一直在尝试使用以下代码来识别 IR 中的数组访问 for BasicBlock iterator ii BB gt begin ii2 ii BB gt end ii Instruction I ii if GetElementPtrIn
  • iPhone 中的应用程序堆大小是多少?

    HI iPhone 中的应用程序堆大小是多少 我的意思是应用程序可以使用 iPhone 中的内存大小 对于 ipod 来说是一样的还是对于 iPhone 或 iPod 来说是不同的 我们可以使用 NSdata 在我们的应用程序中下载的 iP
  • NGINX 与 Tomcat 配置

    我是 Nginx 新手 我需要你的帮助 根据很多论坛我了解到我们所有的静态页面都存储在Nginx中 当有请求到来时 我必须将该请求传递给 tomcat 获取数据 并在 tomcat 生成响应后生成响应 目前 我刚刚做到了 我将请求直接传递给
  • 编码标准维基

    在我的工作地点 我负责创建编码标准文档 一般来说 我们在某种程度上遵循 FxCop 和 StyleCop 工具报告的内容 但我们真正需要的是解释何时使用约定的文档 为什么使用约定 甚至可能是一个简单的示例 将来也可以将其扩展用于其他目的 我
  • pipx 如何知道要使用哪个 Python 版本?

    我是一个坚强的pyenv and poetry开始使用的用户pipx并希望了解更多有关其工作原理的信息 具体来说 我想了解它如何确定安装时使用哪个Python版本 我注意到它似乎在搜索PATH现有的应用程序参考 当您pipx install
  • ASP.NET Core [要求] 不可为 null 的类型

    Here https stackoverflow com questions 6662976 required attribute for an integer value 提出了如何验证不可为空的必需类型的问题 在我的情况下 提供的使字段