使用数据注释对依赖属性进行自定义模型验证

2023-12-01

从现在开始我已经使用了优秀的流利验证库来验证我的模型类。在网络应用程序中,我将它与jquery.验证插件也可以执行客户端验证。 一个缺点是许多验证逻辑在客户端重复,并且不再集中在一个地方。

出于这个原因,我正在寻找替代方案。有many例子出来there显示如何使用数据注释来执行模型验证。看起来很有前途。 我无法找到的一件事是如何验证依赖于另一个属性值的属性。

我们以以下模型为例:

public class Event
{
    [Required]
    public DateTime? StartDate { get; set; }
    [Required]
    public DateTime? EndDate { get; set; }
}

我想确保EndDate大于StartDate。我可以写一个自定义 验证属性扩展验证属性为了执行自定义验证逻辑。不幸的是我找不到获得的方法 模型实例:

public class CustomValidationAttribute : ValidationAttribute
{
    public override bool IsValid(object value)
    {
        // value represents the property value on which this attribute is applied
        // but how to obtain the object instance to which this property belongs?
        return true;
    }
}

我发现自定义验证属性似乎可以完成这项工作,因为它有这个ValidationContext包含正在验证的对象实例的属性。不幸的是,此属性仅在 .NET 4.0 中添加。所以我的问题是:我可以在.NET 3.5 SP1 中实现相同的功能吗?


UPDATE:

看起来FluentValidation 已经支持ASP.NET MVC 2 中的客户端验证和元数据。

不过,最好知道数据注释是否可用于验证依赖属性。


MVC2 附带了一个示例“PropertiesMustMatchAttribute”,它展示了如何让 DataAnnotations 为您工作,并且它应该在 .NET 3.5 和 .NET 4.0 中工作。该示例代码如下所示:

[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)]
public sealed class PropertiesMustMatchAttribute : ValidationAttribute
{
    private const string _defaultErrorMessage = "'{0}' and '{1}' do not match.";

    private readonly object _typeId = new object();

    public PropertiesMustMatchAttribute(string originalProperty, string confirmProperty)
        : base(_defaultErrorMessage)
    {
        OriginalProperty = originalProperty;
        ConfirmProperty = confirmProperty;
    }

    public string ConfirmProperty
    {
        get;
        private set;
    }

    public string OriginalProperty
    {
        get;
        private set;
    }

    public override object TypeId
    {
        get
        {
            return _typeId;
        }
    }

    public override string FormatErrorMessage(string name)
    {
        return String.Format(CultureInfo.CurrentUICulture, ErrorMessageString,
            OriginalProperty, ConfirmProperty);
    }

    public override bool IsValid(object value)
    {
        PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(value);
        object originalValue = properties.Find(OriginalProperty, true /* ignoreCase */).GetValue(value);
        object confirmValue = properties.Find(ConfirmProperty, true /* ignoreCase */).GetValue(value);
        return Object.Equals(originalValue, confirmValue);
    }
}

当您使用该属性时,不是将其放在模型类的属性上,而是将其放在类本身上:

[PropertiesMustMatch("NewPassword", "ConfirmPassword", ErrorMessage = "The new password and confirmation password do not match.")]
public class ChangePasswordModel
{
    public string NewPassword { get; set; }
    public string ConfirmPassword { get; set; }
}

当对自定义属性调用“IsValid”时,整个模型实例都会传递给它,以便您可以通过这种方式获取依赖属性值。您可以轻松地遵循此模式来创建日期比较属性,甚至更通用的比较属性。

Brad Wilson 在他的博客上有一个很好的例子展示了如何添加验证的客户端部分,但我不确定该示例是否适用于 .NET 3.5 和 .NET 4.0。

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

使用数据注释对依赖属性进行自定义模型验证 的相关文章

  • JavaScript 使用正则表达式验证电话号码

    问候溢出者 我正在尝试编写一个正则表达式来验证 10 位数字 形式的电话号码 即 以下情况是有效的 1231231234 或 1111111111 无效的情况是少于 10 位或多于 10 位的数字字符串 到目前为止我的表达是这样的 d 10
  • .NET 3.5 SP1 网络共享允许 exe 应用程序运行

    我可能可以从其他地方找到这个问题 但认为这是一个关于堆栈溢出的好问题 尽管您可以运行非托管 exe 但 NET 2 0 默认情况下会停止从网络共享运行托管 exe 我看到有人提到这在 NET 3 5 SP1 中发生了变化 这是真的 这会包括
  • VueJS - 验证表单文件上传中的文件大小要求

    我正在使用 Bootstrap Vue 表单制作一个简单的表单 用户可以在其中上传文件 有没有办法验证使用 Vue 表单选择的文件的大小 我想阻止用户上传此类文件 我见过this https stackoverflow com questi
  • 重置输入控件的边框颜色 (HTML/Javascript)

    有谁知道使用 javascript 修改输入控件后如何重置它的边框颜色 通过突出显示其中包含不正确或无效数据的字段等来进行验证非常有用 例如 改变边框 document getElementById myinput style border
  • 使用 Angular 2 Forms 根据需要动态标记字段的正确方法是什么?

    使用 Angular 2 2 0 0 推荐的方法是什么动态地根据需要标记字段 使用角形式 https angular io docs ts latest guide forms html 在他们的所有示例中 只需添加必需的属性 如下所示
  • 带有 Unicode 字符的主机名在 Windows 8 中有效

    Uri CheckHostName 回报UriHostNameType Unknown到处都是 但在 Windows 8 上 它又回来了UriHostNameType Dns 为什么突然间带有 Unicode 西里尔字符的主机名在 Wind
  • HTML 表单检查空字段

    我已经在 HTML 表单中实现了输入验证 但是 如果出现任何错误 它不会提示用户 并且仍然继续将其数据发送到测试服务器 下面是我的代码
  • 使用 Java 根据本地 DTD 文件验证 XML 文件

    如何根据本地存储为文件的 DTD 验证 XML 文件 XML 文件没有任何 DOCTYPE 声明 或者可能有一个应该被覆盖的声明 我看了一下这个线程 https stackoverflow com questions 470313 net
  • 验证电子邮件地址是否包含“@”和“.”

    我需要验证插入的电子邮件地址是否包含 和 没有正则表达式 有人能给我 java代码 和 结构图 的例子吗 I suspect你正在追求类似的东西 if address contains address contains Handle bad
  • LINQ2SQL:如何实现通用最大字符串长度验证?

    LINQ2SQL 中的一个常见问题是 虽然 NET 字符串允许为其变量分配任意长度 但您的数据库可能具有特定的最大长度约束 如 VARCHAR 5 这将导致 SQL 错误消息 字符串或二进制数据将被截断 这是非常没有帮助的 因为它不会告诉您
  • JQuery 在提交之前需要复选框和单选按钮

    我很难弄清楚这一点 现在我们已经花了 3 个多小时来研究 JQuery 验证的示例和工具 我想做的只是要求选中一个复选框和一个单选按钮 但我不在乎需要哪一个
  • 如何使用第三方 JS 组件进行 Angular2/4 验证

    当谈到 Angular 2 验证时 我看到了不同的方法 基本方法是使用 HTML5 和模板 模型绑定或带有指定验证器的表单 然而 当涉及到特殊规则时 它需要大量编码 并且模板绑定 因此没有表单 通常会导致验证分散在 HTML 和 TS 代码
  • 访问 BindingContext[dataSource] 与 BindingContext[dataSource, dataMember] 有何不同?

    我们遇到了一个problem https stackoverflow com q 24170402 302677 where 我们在 MDI 工作区中有同一窗口的两个实例 绑定到两个单独的对象模型 对象模型有它们的 Equals and G
  • 需要正则表达式。仅匹配数字和空格的固定长度字段

    我正在尝试获得注册 表达式匹配正好 11 位数字或 0 到 10 位数字 并用空格填充到 11 个字符 x20 Match 12345678901 123 Don t Match 5678901 123 78901 123 789 表达方式
  • Fluent 验证和库

    前几天在寻找完全不同的东西时 我偶然发现了两个用于在 NET 中进行流畅验证的库 这个概念似乎很有趣 因为到目前为止我正在使用通常的条件和分支语句 if else case 等 进行验证 特别是 它使得链接某些条件相对容易 这些条件在某些情
  • Groovy:验证 JSON 字符串

    我需要检查 Groovy 中的字符串是否为有效的 JSON 我的第一个想法就是把它发送出去new JsonSlurper parseText myString 并且 如果没有例外 就假设它是正确的 然而 我发现 Groovy 很乐意接受尾随
  • 是否可以在不使用连接器的情况下将 C# 变量包含在字符串变量中?

    NET 3 5 C 是否允许我们在字符串变量中包含变量 而无需使用 连接符 或 string Format 例如 在伪中 我使用 符号来指定变量 DateTime d DateTime Now string s The date is d
  • WinForms 验证事件阻止 Escape 键关闭表单

    我有一个简单的表单 带有一个文本框 加上 确定 和 取消 按钮 表单的 AcceptButton 和 CancelButton 设置正确 并且 确定 和 取消 按钮的 DialogResult 设置为 确定 和 取消 我想向 TextBox
  • 多语言标记验证器

    是否有免费的在线多语言标记验证服务可以正确识别和验证多语言标记 我确实找到了totalvalidator和htmlvalidator 但这些是 付费 非基于网络的解决方案 Use http validator w3 org nu http
  • 为什么验证不起作用并跳转到另一个页面?

    我写了一个customer display php来验证数据 到目前为止只有名字 但无论名字字段是否为空 网页都会跳转到customer search php并且没有更改数据库中的信息 为什么

随机推荐

  • Magento 2 重定向到支付网关错误

    我已经使用转换器转换了我的 Magento 1 支付模块 我想我需要修改代码以适应 Magento 2 我被困在结账过程中 重定向到支付网关 以下是当 magento 尝试重定向到时我的错误http localhost 8083 mm pd
  • Alfresco 社区版和 Alfresco 企业版有什么区别?

    Alfresco 社区版和 Alfresco 企业版有什么区别 它提供的两种功能有什么区别吗 我们可以下载具有更长试用许可证的企业版吗 企业版是商业支持的版本 除了支持之外 您还可以获得补丁 更新 赔偿以及与认证合作伙伴的联系 从功能的角度
  • 如何在Python中获取__main__模块的文件名?

    假设我有两个模块 a py import b print name file b py print name file 我运行 a py 文件 这打印 b C path to code b py main C path to code a
  • 如何使 WinHttpCrackUrl 在 64 位下工作

    我有 Visual Basic for Applications 代码 使用WinHttp并可与在 32 位 Windows XP 上运行的 32 位 Office 2010 完美配合 即使可以正常编译 相同的代码也无法在 64 位 Win
  • 如何通过 ssh 使用参数执行远程命令?

    In my bashrc我定义了一个稍后可以在命令行上使用的函数 function mycommand ssh email protected cd testdir test sh 1 使用该命令时 只需cd命令在远程主机上执行 这test
  • Python,函数改变值

    所以我在让这个系统正常工作时遇到了麻烦 我不确定我是否提出了正确的问题 但这就是正在发生的事情以及我想要发生的事情 money 1 def Stats print print money str money def gainM money
  • 如何在Jmeter中根据另一个值提取json值

    在 Jmeter 中 我试图从 json 中提取值 这是我收到的 json 响应 Definition key 1124 Id 1743 srcID 3427 pcKey 1 userName abraizada cName JMeter2
  • 使用 JavaScript 解析 XML [重复]

    这个问题在这里已经有答案了 我需要能够使用 JavaScript 解析 XML XML 将位于变量中 我不想使用 jQuery 或其他框架 我看过这个 XML gt jQuery 读取 我从你的猜测最后一个问题在此之前 20 分钟询问 您正
  • 使用tensorflow时Python内核死掉

    我在 Windows 7 操作系统中的 anaconda 4 3 1 64 位 内的 python 3 5 2 下使用tensorflow 仅限 CPU 版本 当我运行以下代码时 python内核死掉了 无法重新启动 出现一些错误 但没有错
  • 将屏幕截图保存为 R Selenium 中的变量

    我正在尝试将 Selenium 的屏幕截图存储到变量中 以便我可以计算出它的高度 library RSelenium library magick server lt remoteDriver remoteServerAddr localh
  • 用 Rust 编写不动点函数

    我刚刚开始 Rust 教程 并以使用递归的此类代码结束 extern crate rand use std io use rand Rng use std cmp Ordering use std str FromStr use std f
  • 基本 CSS 悬停图像交换?

    我是网络开发的超级初学者 我有一个关于尝试 交换 两个图像的问题 我已经编写了 CSS 和标记 但由于某种原因它似乎不起作用 当将鼠标悬停在第一个图像上时 应该交换的第二个图像只是位于页面上第一个图像的顶部 CSS home margin
  • 四舍五入的奇怪之处——“100”有什么特别之处? [复制]

    这个问题在这里已经有答案了 有人对 haskell 中这种奇怪的舍入有解释吗 GHCi 版本 7 2 1 一切看起来都很好 除非我乘以 100 Main gt 1 1 1 1 Main gt 1 1 10 11 0 Main gt 1 1
  • 如何将 HTML 表中的数据插入到 mysql 数据库

    我有一个HTML表格与信息 现在我可以add rows and delete带有使用 javascript 的按钮的行 我还可以使用以下命令直接将信息添加到数据库中Add Rows按钮 然后使用以下命令从数据库中删除数据删除行按钮 但我不想
  • Linq if/else 条件?

    我知道这可能是一个新手问题 有没有办法根据布尔值选择不同的搜索条件 稍后在代码中 我想循环访问该对象 alDisabledPrograms 我知道 if else 不正确 我把它放在那里是为了表明我希望如何处理它 我尝试将其放入更大的 if
  • rijndael 加密 - 仅解密部分字符串

    只有部分字符串被解密 我认为这与我的编码有关 发生的情况如下 string s The brown fox jumped over the green frog string k urieurut string enc EncryptStr
  • 在 Windows Phone 7 上将图像转换为字节数组 没有 System.Drawing Dll 还有其他方法吗?

    Byte result Byte new ImageConverter ConvertTo img1 typeof Byte I cant use Image Converter add Image Class Drawing dll Me
  • 从名称空间生成 UUID?

    尝试根据 2 个唯一字符串生成客户端 ID 这最终应该与服务器中生成的 UUID 相同 来自相同的 Ids 对于 Javascript 它看起来像这样 uuidv5 id1 id2 uuidv5 DNS 似乎找不到在 Swift 上生成它的
  • preg_quote() 的 Ruby 等价物是什么?

    在 PHP 中你需要使用preg quote 转义字符串中在正则表达式中具有特定含义的所有字符 允许 例如 preg match 搜索那些特殊字符 以下代码在 Ruby 中的等价物是什么 The content of this variab
  • 使用数据注释对依赖属性进行自定义模型验证

    从现在开始我已经使用了优秀的流利验证库来验证我的模型类 在网络应用程序中 我将它与jquery 验证插件也可以执行客户端验证 一个缺点是许多验证逻辑在客户端重复 并且不再集中在一个地方 出于这个原因 我正在寻找替代方案 有many例子出来t