自定义 StringLength 验证属性的客户端验证

2024-06-22

我有以下自定义验证属性,它派生自 StringLengthAttribute:

public class StringLengthLocalizedAttribute : StringLengthAttribute
{
    public StringLengthLocalizedAttribute(int maximumLength) : base(maximumLength)
    {
        var translator = DependencyResolver.Current.GetService<ITranslator();
        var translatedValue = translator.Translate("MaxLengthTranslationKey", ErrorMessage);
        ErrorMessage = translatedValue.Replace("{MaxLength}", maximumLength.ToString());
    }
}

此自定义属性的唯一目的是本地化 ErrorMessage。问题是,当我在模型中使用它时,它不会生成任何客户端验证,但标准 StringLength 属性会生成。

我看不出我的属性有何不同 - 因为它派生自 StringLength 属性,所以我不必实现任何其他功能来使客户端验证正常工作?


如果您查看 DataAnnotationsModelValidatorProvider 的源代码,您将在方法 BuildAttributeFactoriesDictionary 中看到特定类型的属性已注册用于客户端验证 - 您创建了一个新类型,因此没有客户端验证。

值得庆幸的是,这还有一个公共方法来添加您自己的适配器,并且在您给出的简单情况下很容易使用:

首先,您需要一个提供客户端验证规则的适配器:

public class MyStringLengthAdapter : DataAnnotationsModelValidator<MyStringLengthAttribute>
{
    public MyStringLengthAdapter(ModelMetadata metadata, ControllerContext context, MyStringLengthAttribute attribute)
        : base(metadata, context, attribute)
    {
    }

    public override IEnumerable<ModelClientValidationRule> GetClientValidationRules()
    {
        return new[] { new ModelClientValidationStringLengthRule(ErrorMessage, Attribute.MinimumLength, Attribute.MaximumLength) };
    }
}

然后,您需要在 Global.asax.cs 的 Application_Start 方法中注册它,如下所示:

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

自定义 StringLength 验证属性的客户端验证 的相关文章

随机推荐

  • 多行 overrideValues Helm 安装 Azure DevOps

    是否可以指定要在 Azure devOps 管道中的 HelmDeploy 任务中覆盖的值 例如 类似下面的任务 显然不完全按原样工作 task HelmDeploy 0 displayName helm install inputs co
  • 如果断言失败则停止测试

    我有一个简单的赛普拉斯测试 describe My First Test gt it Go to login page gt cy visit http localhost 3000 cy contains Log in click it
  • 在 AngularJS 中从 Firebase 实时更新信息

    我使用 Angular JS 从 Firebase 制作了一个显示信息的应用程序 目前 刷新页面后信息会更新 但我想实时更新我的 信息 这是我的角度代码 var root angular module root services fireb
  • R 中 data.table 的聚合

    该练习包括通过 R 中的 data table 的因素组合来聚合数值向量 以以下数据表为例 require data table require plyr dtb lt data table cbind expand grid month
  • Multidex安装失败

    我正在使用 CircledImageView 库 它在棒棒糖 Android 版本上运行良好 但在 Kitkat 中 它崩溃了 于是在google上搜索之后 我发现我必须在我的应用程序中实现 multidex 这是我的应用程序类 publi
  • 类的方法之间的区别,哪些是“函数”,哪些是“绑定方法”?

    我做了一些实验 通过检查 dict 对于类或实例 我可以看到某些方法具有类型function还有一些bound method 实验很乱 下面的问题我都想不出来 在Python 3中 类或实例的方法之间有什么区别 哪些是 函数 哪些是 绑定方
  • “ListView”已从 React Native 中删除

    我的模拟器说 ListView 已从 React Native 中删除 是的 它自 2017 年 3 月版本以来已被删除 您无法再使用它 来自docs https facebook github io react native blog 2
  • 计算指定窗口内的滚动计数

    示例数据可能比解释它更有助于解释我正在尝试做的事情 所以我将从它开始 这是我目前正在使用的数据 CallStart CallDuration 2017 09 15 09 15 15 313 00 01 28 2017 09 15 09 15
  • AWS:在 Redshift 中自动查询

    我想自动化每天运行的 redshift 插入查询 我们实际上使用的是aws环境 有人告诉我使用 lambda 不是正确的方法 这是在 Redshift 中自动执行查询的最佳 ETL 流程 要在 Redshift 上自动化 SQL 您有 3
  • Angular 7:将 HTML 转换为 PDF

    我正在尝试将 HTML 表格转换为 PDF 但没有成功 我已经使用 jsPDF 来做到这一点 但结果非常差 我试图理解为什么 考虑到我有一台平板电脑 我想要的是将此表以横向模式打印在 A4 页面上 使用所需的所有页面 我的问题是 PDF 是
  • 将 NSPoint 从窗口坐标转换为视图坐标

    我的应用程序有一个自定义视图 显示事件的时间线 该视图包含在NSScrollView支持时间线的水平滚动 使用通知 我实现了一种机制 该机制应该显示另一个自定义视图 当用户在时间线中单击该事件时 该视图会显示有关该事件的详细信息 下面是时间
  • Laravel 5.2:如何从自己的事件监听器访问请求和会话类?

    In Laravel 5 2 我添加了我的事件监听器 到app Providers EventServiceProvider php like protected listen Illuminate Auth Events Login gt
  • 如何使用Python从网页下载文本文件或某些对象?

    我正在编写一个函数 用于下载并存储今天的预发布域 txt 文件列表http www namejet com pages downloads aspx http www namejet com pages downloads aspx 我正在
  • 有没有办法使用Java中的Azure Functions的@EventHubTrigger来获取事件(EventHub)的标题数据?

    我有一个使用 azure functions java library 实现的 Azure 函数 它从一个 EventHub 接收事件 并且我正在使用 EventHubTrigger 问题是我需要来自事件的标头数据 但我看不到任何方法来获取
  • 如何在浏览器中始终显示垂直滚动条?

    我想始终在我的网页中显示垂直滚动条 可以使用javascript吗 我认为使用 javascript 或 jQuery 是可能的 我想要垂直滚动条 无论是否有足够的内容可以显示 thanks 不应该需要 jQuery 您可以尝试添加CSS
  • QTextEdit 与 QPlainTextEdit

    有什么区别QTextEdit and QPlainTextEdit 为什么要使用其中一种而不是另一种 我正在编写一个文本编辑器作为学习 Qt5 的练习 现在我想知道是否使用QTextEdit or QPlainTextEdit 到目前为止我
  • ES6,如何在一行中导出导入的模块?

    如果可能的话 我想要以下内容 但只有一行 import Module from Module Module export Module 我尝试了以下方法 但似乎不起作用 export Module from Module Module ex
  • 如何使用一组指定的 EEG 通道在 Python MNE 中绘制蒙太奇?

    我已经使用 Python 的 MNE 包加载了一些脑电图数据 该数据具有从 10 20 个蒙太奇中获得的 46 个记录通道 但我们已经识别出许多死通道 并且只想关注其余通道 我可以删除频道 但我不知道如何绘制更新的蒙太奇 首先 我加载 ed
  • 从 gulp 任务内部调用“ng build”

    我在我的项目中使用 angular cli 我想添加一些 gulp 任务进行部署 我是否可以从 gulp 任务中调用 ng build 您可以使用 child process 进行命令行调用 var exec require child p
  • 自定义 StringLength 验证属性的客户端验证

    我有以下自定义验证属性 它派生自 StringLengthAttribute public class StringLengthLocalizedAttribute StringLengthAttribute public StringLe