int 数据类型的服务器端验证

2023-11-29

我制作了自定义验证器属性

partial class DataTypeInt : ValidationAttribute
{
    public DataTypeInt(string resourceName)
    {
        base.ErrorMessageResourceType = typeof(blueddPES.Resources.PES.Resource);
        base.ErrorMessageResourceName = resourceName;
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        string number = value.ToString().Trim();
        int val;
        bool result = int.TryParse(number,out val );
        if (result)
        {
            return ValidationResult.Success;
        }
        else 
        {
            return new ValidationResult("");
        }
    }
}

但是当我在文本框中输入字符串而不是 int 值时value==null当我输入 int 值时value==entered value;. Why?

有没有什么替代方案可以实现相同的目标(确保仅在服务器端)


发生这种情况的原因是模型绑定器(运行before任何验证器)无法将无效值绑定到整数。这就是为什么在你的验证器中你没有获得任何价值。如果您希望能够验证这一点,您可以为整数类型编写一个自定义模型绑定程序。

此类模型绑定器如下所示:

public class IntegerBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
        int temp;
        if (value == null || 
            string.IsNullOrEmpty(value.AttemptedValue) || 
            !int.TryParse(value.AttemptedValue, out temp)
        )
        {
            bindingContext.ModelState.AddModelError(bindingContext.ModelName, "invalid integer");
            bindingContext.ModelState.SetModelValue(bindingContext.ModelName, value);
            return null;
        }

        return temp;
    }
}

你将把它注册在Application_Start:

ModelBinders.Binders.Add(typeof(int), new IntegerBinder());

但您可能会问:如果我想自定义错误消息怎么办?毕竟,这就是我最初想要实现的目标。当默认的模型绑定器已经为我做到这一点时,编写这个模型绑定器有什么意义,只是我无法自定义错误消息?

嗯,这很容易。您可以创建一个自定义属性,该属性将用于装饰您的视图模型,并将包含错误消息,并且在模型绑定器内,您将能够获取此错误消息并使用它。

因此,您可以有一个虚拟验证器属性:

public class MustBeAValidInteger : ValidationAttribute, IMetadataAware
{
    public override bool IsValid(object value)
    {
        return true;
    }

    public void OnMetadataCreated(ModelMetadata metadata)
    {
        metadata.AdditionalValues["errorMessage"] = ErrorMessage;
    }
}

你可以用它来装饰你的视图模型:

[MustBeAValidInteger(ErrorMessage = "The value {0} is not a valid quantity")]
public int Quantity { get; set; }

并调整模型绑定器:

public class IntegerBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
        int temp;
        var attemptedValue = value != null ? value.AttemptedValue : string.Empty;

        if (!int.TryParse(attemptedValue, out temp)
        )
        {
            var errorMessage = "{0} is an invalid integer";
            if (bindingContext.ModelMetadata.AdditionalValues.ContainsKey("errorMessage"))
            {
                errorMessage = bindingContext.ModelMetadata.AdditionalValues["errorMessage"] as string;
            }
            errorMessage = string.Format(errorMessage, attemptedValue);
            bindingContext.ModelState.AddModelError(bindingContext.ModelName, errorMessage);
            bindingContext.ModelState.SetModelValue(bindingContext.ModelName, value);
            return null;
        }

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

int 数据类型的服务器端验证 的相关文章

  • 如何使用平台调用编组 void*

    我需要从 dll 中包含的 C api 调用函数 函数原型如下 int func char name void value 其中指针值的内容可以引用依赖于传递的名称的任何类型 我不确定如何设置 Dll 输入端口以正确编组此 void 我一直
  • 在“delete this;”语句期间发生了什么?

    请考虑以下代码 class foo public foo foo void done delete this private int x 以下两个选项中发生了什么 并且有效吗 选项1 void main foo a new foo a gt
  • ASP.NET MVC 数据注释属性 Range 从另一个属性值设置

    您好 我的 Asp net MVc 模型中有以下内容 测试模型 cs public class TestModel public double OpeningAmount get set Required ErrorMessage Requ
  • ICSharpCode.Decompiler + Mono.Cecil -> 如何为单个方法生成代码?

    我可以使用 Mono Cecil 和 ICSharpCode Decompiler 生成类型或程序集的代码 但是 如果我尝试为单个方法生成代码 我将收到错误 对象引用未设置为对象的实例 你们能给我任何关于这个的提示吗 提前感谢您的所有帮助
  • Image.FromStream() 方法返回 Invalid Argument 异常

    我正在从智能相机成像器捕获图像 并通过套接字编程从相机接收字节数组 NET 应用程序是客户端 相机是服务器 问题是我在运行时收到 System InvalidArgument 异常 private Image byteArrayToImag
  • FxCop 和 GAC 疯狂

    当我尝试分析依赖于模式和实践 企业库数据 以及其他 2 0 0 0 的项目时使用 FxCop FxCop 抱怨它不能 定位程序集引用 即使正在分析的应用程序 dll 是根据其编译的此版本及其在 GAC 中 如果我浏览到 GAC 尝试选择相同
  • autofac 中的条件组件注册

    是否可以根据其他组件的状态有条件地注册组件 就像是 ContainerBuilder RegisterConditionally
  • 调用 Console.ReadLine() 的方法的 C# 单元测试

    我想为名为的类的成员函数创建一个单元测试ScoreBoard它存储了一场比赛中排名前五的球员 问题是我为 SignInScoreBoard 正在呼叫Console ReadLine 这样用户就可以输入他们的名字 public void Si
  • 如何将8字节的十六进制数输入到char数组中?

    我想生成以以下开头的十六进制数字序列07060504003020100 下一个数字是0f0e0d0c0b0a0908等等按这个顺序 当我使用unsigned long long int并输出数据的前4位 这意味着0被截断 它打印706050
  • 检查字符串中是否存在所有字符值

    我目前正在做这项任务 但我被困住了 目标是读取文件并查找文件中的字符串中是否存在这些字符值 我必须将文件中的字符串与作为参数放入的另一个字符串进行比较 但是 只要每个字符值位于文件中的字符串中 那么它就 匹配 示例 输入和输出 a out
  • 当网站停止时,Oracle 数据提供程序会固定 IIS 工作进程

    我们在 Oracle 11g 第 2 版中遇到了一个严重的问题 其中 w3wp 进程接管了整个处理器核心 并且调试显示 Oracle 数据提供程序无限地抛出 ThreadAbortException 开发人员通过执行以下操作发现了此问题 1
  • 将 jstring 转换为 QString

    我正在调用一个返回字符串的 Java 函数 QAndroidJniObject obj QAndroidJniObject callStaticObjectMethod
  • 从 ASP.NET Web API 返回 HTML

    如何从 ASP NET MVC Web API 控制器返回 HTML 我尝试了下面的代码 但由于未定义 Response Write 而出现编译错误 public class MyController ApiController HttpP
  • 在另一个类中使用一个类对象?

    我正在用 c 制作应用程序 在该应用程序中 我有一个类DataCapture cs 在同一个应用程序中 我有另一个类Listner cs 在 Listner cs 类中 我想使用以下对象DataCapture cs不创建新对象DataCap
  • 代表和结构的速度问题

    我遇到了一些与结构和委托有关的速度问题 采用以下控制台应用程序代码 public delegate string StringGetter public class LocalString public LocalString string
  • 如何使用 C# 以编程方式识别对方法的引用数量

    我最近继承了需要一些修剪和清理的 C 控制台应用程序 长话短说 该应用程序由一个包含超过 110 000 行代码的类组成 是的 单个类中有超过 110 000 行 当然 该应用程序是我们业务的核心 全天候运行更新动态网站上使用的数据 尽管我
  • 如何同时正确使用管道和信号?

    我有 2 个孩子 我想将信号从孩子发送到父母 并将答案 随机数 为什么 为什么不 命名管道从父母发送到每个孩子 我有这个代码 include
  • 如何使用 XmlSerializer 生成标记前缀

    我想使用 XmlSerializer 生成以下内容
  • 我的 C 程序无法运行,并显示“无法执行二进制文件:Exec 格式错误”

    我刚刚从 C 开始 我试图编译下面的代码并执行它 但出现错误 也在运行sizeBS 或数据堆栈中没有显示任何内容 include
  • GCC编译非常慢(文件大)

    我正在尝试编译一个大的 C 文件 专门用于 MATLAB mexing C 文件大约 20 MB 可用来自 GCC 错误跟踪器 https gcc gnu org bugzilla attachment cgi id 36632如果你想玩一

随机推荐

  • 如何将字符数组转换为字符串?

    转换 C string使用 char 数组非常简单c str字符串的函数然后做strcpy 然而 如何反其道而行之呢 我有一个 char 数组 例如 char arr This is a test 转换回 string str This i
  • 在 Windows 中将 Bonjour (dns_sd.h) 库添加到 Qt

    我一直在尝试正确添加Apple提供的开源dns sd h库 我正在编写一个使用 BonjourRegistrar 类的程序 如下所示 链接文本 我已经在Mac环境上编写了我的程序 现在我正在尝试将其移植到Windows Bonjour SD
  • 在 Python 中将 .CSV 文件转换为 .DTA 文件

    我希望通过 Python 自动化将许多 CSV 文件转换为 DTA 文件的过程 DTA 文件是由 Stata 统计语言处理的文件类型 然而 我还没有找到一种方法来做到这一点 The R语言有写 dta 它允许将 R 中的数据帧转换为 dta
  • Qt 5.5 和 OpenGL:检索设备信息

    我编写了一个 Qt 5 5 应用程序 它以 QOpenGLWidget 的形式使用 OpenGL 现在我希望用户可以从应用程序中看到他们的设备信息 我的意思是 卡的名称 例如 GT 640 Vendor GPU 总内存 驱动版本 扩展列表
  • 检测没有磁盘空间iPhone SDK

    假设我需要将许多图像写入iPhone文件系统 我需要找到足够的空间将图像写入磁盘 可以使用iPhone SDK吗 对的 这是可能的 请参阅以下教程 使用强大的 google 搜索引擎找到 http iphoneincubator com b
  • 如何使用 insert_many 安全地忽略重复的键错误

    当将 insert many 与 pymongo 一起使用时 我需要忽略重复插入 其中重复项基于索引 我在 stackoverflow 上看到过这个问题 但没有看到有用的答案 这是我的代码片段 try results mongo conne
  • 如何使用 JSP/Java 检测移动设备(iOS 和 Android)?

    只是想知道是否有人遇到过这个 基本上 我希望使用 JSP 检测 iOS 和 Android 并能够有条件地将 CSS 和 JS 文件添加到页面 有任何想法吗 一个非常简单的解决方案是 由于 else 语句非常短 因此仅当您只提供 iOS 和
  • 从字符串名称在程序集中创建类实例

    我不确定这是否可行 而且我对在 C NET 中使用程序集还很陌生 我想做的是在提供该类的字符串名称时创建该类的实例 像这样的事情 using MyAssembly namespace MyNameSpace Class MyClass in
  • 设置关闭和断开 IBM MQ.NET 客户端的超时

    是否可以为以下代码设置超时时间 private MQQueueManager queueManager private MQQueue queue queue Close queueManager Disconnect 原因是有时连接在尝试
  • Spark Regexp:根据日期拆分列

    我的数据框中有一列称为 数据 如下所示 blah blah blah blah 10 7 17service 我想将其分成三个不同的列 如下所示 col1 blah blah blah blah col2 10 7 17 col3 serv
  • Android 1.5 中 onDateChanged() 中具有最大和最小日期的日期选择器?

    我正在 android 1 5 中开发 DatePicker 我正在尝试设置最大和最小日期 最小日期应该是当前日期 最大日期应该是我将从字符串中提供的日期 如 maxYear maxMonth maxDay 假设今天的日期 30 12 20
  • 如何释放本地 Windows 上的 80 端口?

    我安装了 XAMPP 1 6 8 但由于某种原因它不起作用 后来发现80端口没有空闲或者没有监听 我怎样才能释放它或使其免费 多谢 我发现接管80端口的是http api服务 我在cmd中写道 net stop http 问我 以下服务将停
  • 使用 MVVM Light 和 DispatcherHelper 进行单元测试

    我有一个使用 MVVM Light Toolkit 的 SL4 应用程序 在视图模型中 我调用从 OData 服务检索数据的数据服务 在 VM 中 我使用 DispatcherHelper 实用程序类 MVVM Light 的一部分 根据传
  • 输出UTF-16?有点卡住了

    我有一些代理对形式的 UTF 16 编码字符 我想将这些代理对作为字符输出在屏幕上 有谁知道这怎么可能 iconv UTF 16 UTF 8 yourString
  • HTML 文档中的名称属性必须是唯一的吗?

    我记得有一次在规范中读到id属性和name属性共享相同的命名空间并且必须是唯一的 从今以后 我一直试图在我的申请中满足这一要求 甚至害怕给出同样的要求id and name到同一个元素 但最近我开始使用 ASP NET MVC 3 它 像
  • 当没有名称列时(或者当应该创建名称列时)

    我正在尝试将数据从长变为宽 但在这里我需要创建名称列 例如 event1 event2 event3 等 换句话说 没有自然的候选者names from争论 我尝试了几种不同的方法 但无法得到我正在寻找的东西 这是一个可重现的例子 set
  • glDrawArrays 仅在我退出时更新

    我在 python3 中有这段代码 它不能在 Windows 机器上运行 但可以在 Linux 机器上运行 我绘制了一个绿色屏幕和一个红色三角形 但红色三角形仅在我退出时出现 import pygame import numpy impor
  • Scala 扩展双箭头

    我正在看Anorm 源代码和RowParser trait它有这样的声明 trait RowParser A extends Row gt SqlResult A 我很好奇什么类型 Row gt SqlResult A 是 我在任何地方都找
  • 借用亲子关系检查器

    我有下面的代码生成在其注释中标记的错误消息 我想我理解这个消息 我想借用父级两次 一次用于查找其子级 一次作为子级的参数 并且错误中的可变 不可变单词不相关 我必须证明这一点Child修改后不会消失Parent 但我不知道该怎么做 我可以R
  • int 数据类型的服务器端验证

    我制作了自定义验证器属性 partial class DataTypeInt ValidationAttribute public DataTypeInt string resourceName base ErrorMessageResou