ASP.NET MVC 2 验证消息本地化策略扩展

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

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

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

[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)

{

for
each (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());

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

时间: 2024-08-27 01:57:40

ASP.NET MVC 2 验证消息本地化策略扩展的相关文章

一起谈.NET技术,ASP.NET MVC 2 验证消息本地化策略扩展

ASP.NET MVC2 结合System.ComponentModel.DataAnnotations 提供了一套非常有效的实体验证框架.对于错误信息的处理,它默认提供了两种选择: 字符串常量 从程序集资源文件读取 但是在我们这里,我们有一套自己的资源文件方案,也就是我们需要自己控件错误信息的本地化操作.由于在元数据,我们只能提供常量,无法进行字符串操作.一种比较直接和麻烦的办法就是重写所有的验证规则,在验证规则中对字符串常量进行本地化操作. [AttributeUsage(Attribute

通过扩展改善ASP.NET MVC的验证机制[使用篇]

原文:通过扩展改善ASP.NET MVC的验证机制[使用篇] ASP.NET MVC提供一种基于元数据的验证方式是我们可以将相应的验证特性应用到作为Model实体的类型或者属性/字段上,但是这依然具有很多的不足.在这篇文章中,我结合EntLib的VAB(Validation Application Block)的一些思想通过扩展为ASP.NET MVC提供一种更为完善的验证机制.[源代码从这里下载] 目录: 一.扩展旨在解决怎样的验证问题 二.一个简单的消息维护组件 三.多语言的支持 四.基于某

ASP.NET MVC 5 - 验证编辑方法(Edit method)和编辑视图(Edit view)

原文:ASP.NET MVC 5 - 验证编辑方法(Edit method)和编辑视图(Edit view) 在本节中,您将验证电影控制器生成的编辑方法(Edit action methods)和视图.但是首先将修改点代码,使得发布日期属性(ReleaseDate)看上去更好.打开Models \ Movie.cs文件,并添加高亮行如下所示: using System; using System.ComponentModel.DataAnnotations; using System.Data.

AngularJS+ASP.NET MVC+SignalR实现消息推送

原文:AngularJS+ASP.NET MVC+SignalR实现消息推送 背景 OA管理系统中,员工提交申请单,消息实时通知到相关人员及时进行审批,审批之后将结果推送给用户. 技术选择 最开始发现的是firebase,于是很兴奋的开始倒腾起来.firebase用起来倒是简单:引用一个js即可,按官网上的教程很快便应用到了项目中.第二天打开项目发现推送功能不好使了,这是为何?最后发现firebase官网打不开了...难道firebase被google收了也会被天朝给墙掉?也许是firebase

ASP.NET MVC数据验证

关于ASP.NET MVC的验证,用起来很特别,因为MS的封装,使人理解起来很费解.也可能很多人都在Scott Guthrie等人写的一本<ASP.NET MVC 1.0>书中,见过NerdDinner项目中对Dinner对象修改和添加的时的数据验证.但有许多封装的地方,不知道是怎样的工作原理,今天研究了,拿出来给大家分享一下. 数据库还是上一篇blog中的库与表,同样的方法来创建news表的实体类,在自动生成的news这个实体类中,我们发现有一个特殊的分部方法: partial void O

艾伟_转载:ASP.NET MVC数据验证

关于ASP.NET MVC的验证,用起来很特别,因为MS的封装,使人理解起来很费解.也可能很多人都在Scott Guthrie等人写的一本<ASP.NET MVC 1.0>书中,见过NerdDinner项目中对Dinner对象修改和添加的时的数据验证.但有许多封装的地方,不知道是怎样的工作原理,今天研究了,拿出来给大家分享一下. 数据库还是上一篇blog中的库与表,同样的方法来创建news表的实体类,在自动生成的news这个实体类中,我们发现有一个特殊的分部方法: partial void O

通过扩展改善ASP.NET MVC的验证机制[实现篇]

在<使用篇>中我们谈到扩展的验证编程方式,并且演示了本解决方案的三大特性:消息提供机制的分离.多语言的支持和多验证规则的支持,我们现在来看看这样的验证解决方案最终是如何实现的. 目录: 一.为验证创建一个上下文:ValidatorContext 二.通过自定义ActionInvoker在进行操作执行之前初始化上下文 三.为Validator创建基类:ValidatorBaseAttribute 四.通过自定义ModelValidatorProvider在验证之前将不匹配Validator移除

ASP.NET MVC 数据验证及相关内容_实用技巧

一.数据验证 数据验证的步骤在模型类中添加与验证相关的特性标记在客户端导入与验证相关的js文件和css文件使用与验证相关的Html辅助方法在服务器端判断是否通过服务器端验证常用的验证标记 Required:非空验证StringLength:验证字符串的长度RegularExpression:正则表达式验证Compare:比较两个字段的值是否相等Range:范围验证Remote:服务器验证(需要在controller中编写返回值为JsonResult的Action)自定义验证标记与验证相关的js文

Asp.net Mvc 身份验证、异常处理、权限验证 代码

本问主要介绍asp.net的身份验证机制及asp.net MVC拦截器在项目中的运用.现在让我们来模拟一个简单的流程:用户登录>权限验证>异常处理. 1.用户登录 验证用户是否登录成功步骤直接忽略,用户登录成功后怎么保存当前用户登录信息(session,cookie),本文介绍的是身份验证(其实就是基于cookie)的,下面看看代码. 引入命名空间  代码如下 复制代码 using System.Web.Security; Users ModelUser = new Users() { ID