博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一起谈.NET技术,ASP.NET MVC 2 验证消息本地化策略扩展
阅读量:5994 次
发布时间:2019-06-20

本文共 1679 字,大约阅读时间需要 5 分钟。

  ASP.NET MVC2 结合System.ComponentModel.DataAnnotations 提供了一套非常有效的实体验证框架。对于错误信息的处理,它默认提供了两种选择:

  1. 字符串常量
  2. 从程序集资源文件读取

  但是在我们这里,我们有一套自己的资源文件方案,也就是我们需要自己控件错误信息的本地化操作。由于在元数据,我们只能提供常量,无法进行字符串操作。一种比较直接和麻烦的办法就是重写所有的验证规则,在验证规则中对字符串常量进行本地化操作。

 
[AttributeUsage(AttributeTargets.Parameter
|
AttributeTargets.Field
|
AttributeTargets.Property, AllowMultiple
=
false
)]
public
class
CustomValidationAttribute : System.ComponentModel.DataAnnotations.ValidationAttribute
{
public
CustomValidationAttribute(
string
message)
:
base
(()
=>
message.Localize())
{
}
}

  但是这样做,一方面会比较麻烦,所有的验证规则我们都要进行重写;另一方面我们在设计model时就是特别的小心使用我们自己重写过的规则才能达到我们的目的,这将大大降低开发体验。为此,今天特别再次对照MVC2的源码,希望能找到一个可用的扩展点来解决这个问题。最终发现我们可以通过重写DataAnnotationsModelValidatorProvider的GetValidators方法来达到我们希望的效果:

 
public
class
CustomDataAnnotationsModelValidatorProvider : System.Web.Mvc.DataAnnotationsModelValidatorProvider
{
protected
override
IEnumerable GetValidators(ModelMetadata metadata, ControllerContext context, IEnumerable attributes)
{
foreach
(ValidationAttribute attribute
in
attributes.OfType())
{
if
(
!
string
.IsNullOrWhiteSpace(attribute.ErrorMessage))
{
attribute.ErrorMessage
=
attribute.ErrorMessage.Localize();
}
}
var validators
=
base
.GetValidators(metadata, context, attributes);
return
validators;
}
}

  代码非常简单,我们只是在调用GetValidators方法之前,对attribute的错误消息进行一次本地化操作处理即可。通过这一次处理,我们可以同步处理客户端验证消息和服务器端验证消息的本地化。下面的工作就是用这个Provider来代替它的父类,在Global.asax添加下面的代码即可完成:

 
ModelValidatorProviders.Providers.RemoveAt(
0
);
ModelValidatorProviders.Providers.Insert(
0
,
new
CustomDataAnnotationsModelValidatorProvider());

  通过这样一个小小的扩展,就可以很完美的达到我们的目的。不过,为了这个小扩展,却花费了我们不少的时间。

转载于:https://www.cnblogs.com/waw/archive/2011/08/29/2158700.html

你可能感兴趣的文章
php实现 明明的随机数
查看>>
Guava中针对集合的 filter和过滤功能
查看>>
小程序顶部导航栏的自定义
查看>>
ZooKeeper系列(3):znode说明和znode状态
查看>>
Java Arrays.sort源代码解析
查看>>
使用buildroot创建自己的交叉编译工具链【转】
查看>>
使用superlance插件增强supervisor的监控能力
查看>>
Js:消息弹出框、获取时间区间、时间格式、easyui datebox 自定义校验、表单数据转化json、控制两个日期不能只填一个...
查看>>
移动Web前端,游客点击商品的收藏按钮,登录完成,回来之后,如何自动收藏...
查看>>
css自适应浏览器大小
查看>>
C#与C++的发展历程第二 - C#4.0再接再厉
查看>>
VS Code使用 Vue工程配置 eslint
查看>>
107. 二叉树的层次遍历 II
查看>>
ionic3+angular4+cordova 项目实例
查看>>
tracepath 路由跟踪命令
查看>>
(转)设计模式——观察者模式
查看>>
Jar包冲突解决方法
查看>>
彻底搞清楚Java并发 (一) 基础
查看>>
VS连接Windows Mobile模拟器
查看>>
SQL疑难杂症【3】链接服务器提示"无法启动分布式事物"
查看>>