让我们的ASP.NET MVC应用可以单独维护验证消息
2011-12-14 10:45
1026 查看
在项目开发中,我们会使用到很多的描述性文字,比如验证消息、错误消息和确认消息等,让这些文本消息具有可维护性具有重要的意义。虽然我们可以将它们存储于资源文件中,并且ASP.NET的ValidationAttribute也对这种方式提供了原生的支持。但是资源文件的每个条目仅仅是简单的键-值对,只能存储消息的文本值而已,在我们的项目开发中使用的是专门的一个维护消息的组件。在这篇文章中将会通过扩展现有的ValidationAttribute特性让ASP.NET MVC应用可以使用我们的消息组件来获取验证消息。[源代码从这里下载]
[/code]
通过直接继承ValidationAttribute的方式,我们定义了如下一个ExtendedValidationAttribute。我们仅仅定义了一个将消息ID和替换站位符的对象数组作为参数的构造函数,而该构造函数直接调用基类包含Func<string>参数的构造函数。至于用于获取验证消息Func<string>对象,则使用调用MessageManager的GetMessage方法来构建。
[/code]
[/code]
[/code]
在创建的ASP.NET MVC项目中添加下一个HomeController。
[/code]
Index.cshtml的内容如下所示,这是一个以Person对象作为Model的View。具体来说,这个View用于对Person对象三个属性的修改。
[/code]
运行我们的程序,如果输入的内容不符合定义在Person类型上的验证规则,相应的验证消息会被现实,而这些消息都是通过MessageManager来获取的。
一、ExtendedValidationAttribute
我们通过如下一个MessageManager来模拟我们独立的消息组件。简单起见,我们通过一个静态字典来维护所有的消息,Key和Value分别代表消息的Id和文本值。从如下的代码可以看出,消息文本可以支持{0}、{1}、…形式表示站位符。GetMessage方法根据指定的消息ID和替换站位符的对象数组格式化一个完成得消息文本。[code] public class MessageManager { static Dictionary<string, string> messages = new Dictionary<string, string>(); static MessageManager() { messages.Add("RequiredField", "The \"{0}\" is mandatory!"); messages.Add("GreaterThan", "The \"{0}\" must be greater than \"{1}\"!"); messages.Add("LessThan", "The \"{0}\" must be less than \"{1}\"!"); } public string GetMessage(string messageId, params object[] args) { return string.Format(CultureInfo.CurrentCulture, messages[messageId], args); } public static MessageManager Current = new MessageManager(); }
[/code]
通过直接继承ValidationAttribute的方式,我们定义了如下一个ExtendedValidationAttribute。我们仅仅定义了一个将消息ID和替换站位符的对象数组作为参数的构造函数,而该构造函数直接调用基类包含Func<string>参数的构造函数。至于用于获取验证消息Func<string>对象,则使用调用MessageManager的GetMessage方法来构建。
[code] public class ExtendedValidationAttribute : ValidationAttribute { public ExtendedValidationAttribute(string messageId, params object[] args): base(()=>MessageManager.Current.GetMessage(messageId,args)) { } }
[/code]
二、扩展的RequiredAttribute和RangeAttribute
接下来我们来演示如何定义具体的ValidationAttribute,我们以用于验证必需字段/属性和值范围的RequiredAttribute和RangeAttribute为例。下面是我们自定义的RequiredAttribute和RangeAttribute,这里使用了一个比较讨巧的方式:直接调用System.ComponentModel.DataAnnotations.RequiredAttribute和System.ComponentModel.DataAnnotations.RangeAttribute的IsValid方法来实施验证。[code] [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)] public class RequiredAttribute : ExtendedValidationAttribute { public bool AllowEmptyStrings { get; set; } public RequiredAttribute(string messageId, params object[] args) : base(messageId,args) {} public override bool IsValid(object value) { return new System.ComponentModel.DataAnnotations.RequiredAttribute {AllowEmptyStrings = this.AllowEmptyStrings }.IsValid(value); } } [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)] public class RangeAttribute : ExtendedValidationAttribute { private System.ComponentModel.DataAnnotations.RangeAttribute innerRangeAttribute; public RangeAttribute(double minimum, double maximum, string messageId, params object[] args) : base(messageId, args) { innerRangeAttribute = new System.ComponentModel.DataAnnotations.RangeAttribute(minimum, maximum); } public RangeAttribute(int minimum, int maximum, string messageId, params object[] args): base(messageId, args) { innerRangeAttribute = new System.ComponentModel.DataAnnotations.RangeAttribute(minimum, maximum); } public RangeAttribute(Type type, string minimum, string maximum,string messageId, params object[] args) : base(messageId, args) { innerRangeAttribute = new System.ComponentModel.DataAnnotations.RangeAttribute(type, minimum, maximum); } public override bool IsValid(object value) { return innerRangeAttribute.IsValid(value); } }
[/code]
三、实例演示
接下来我们来演示上面定义的两个验证特性在ASP.NET MVC项目中的应用。我们先定义如下一个实体类型Person,RequiredAttribute和RangeAttribute分别应用在表示名字、年龄和体重的Name、Age和Weight三个属性上。具体的验证规则是:名称是必需的,年龄必须大于18周岁而体重不得终于160斤。表示验证消息的ID和站位符对象数组作了相应的设置。[code] public class Person { [Required("RequiredField","Name")] public string Name { get; set; } [Range(18,int.MaxValue,"GreaterThan","Age",18)] public int Age { get; set; } [Range(int.MinValue, 160, "LessThan", "Weight", 160)] public double Weight { get; set; } }
[/code]
在创建的ASP.NET MVC项目中添加下一个HomeController。
[code] public class HomeController : Controller { public ActionResult Index() { return View(new Person { Name = "Zhan San", Age = 24, Weight = 120 }); } [HttpPost] public ActionResult Index(Person person) { if (this.ModelState.IsValid) { throw new NotImplementedException(); } return View(); } }
[/code]
Index.cshtml的内容如下所示,这是一个以Person对象作为Model的View。具体来说,这个View用于对Person对象三个属性的修改。
[code] @model Artech.Web.Mvc.Extensions.Person @{ ViewBag.Title = "Index"; } <h2>Index</h2> @using (Html.BeginForm()) { @Html.EditorForModel() <input type="submit" value="Save" /> }
[/code]
运行我们的程序,如果输入的内容不符合定义在Person类型上的验证规则,相应的验证消息会被现实,而这些消息都是通过MessageManager来获取的。
相关文章推荐
- ASP.NET MVC基于标注特性的Model验证:将ValidationAttribute应用到参数上
- ASP.NET MVC5+MySql使用ASP.NET 身份验证实现用户和角色功能 1 概述 目标:使用MySql数据库,建立一个使用ASP.NET 身份验证的应用,并实现角色功能,身份
- ASP.NET MVC 微信公共平台开发之验证消息的真实性
- ASP.NET MVC:定制Numeric属性验证消息
- asp.net MVC&JQuery 应用(表单验证)
- [ASP.NET MVC]如何定制Numeric属性/字段验证消息
- [ASP.NET MVC]如何定制Numeric属性/字段验证消息
- ASP.NET MVC 2 验证消息本地化策略扩展
- asp.net MVC&JQuery 应用(表单验证)
- 一起谈.NET技术,ASP.NET MVC 2 验证消息本地化策略扩展
- ASP.NET MVC基于标注特性的Model验证:将ValidationAttribute应用到参数上
- 【转】asp.net MVC&JQuery 应用(表单验证)
- [转][ASP.NET MVC]如何定制Numeric属性/字段验证消息
- ASP.NET MVC基于标注特性的Model验证:将ValidationAttribute应用到参数上
- asp.net mvc Model验证中MetadataType的应用
- ASP.NET MVC 2 中的模型验证和元数据
- ASP.NET MVC下的四种验证编程方式
- ASP.NET MVC 5– 使用Wijmo MVC 5模板1分钟创建应用
- Asp.Net MVC 身份验证-Forms
- ASP.NET MVC 多语言实现技巧 最简、最易维护和最快速开发