技术开发 频道

ASP.NET MVC:消息组件获取验证消息

  【IT168技术】在项目开发中,我们会使用到很多的描述性文字,比如验证消息、错误消息和确认消息等,让这些文本消息具有可维护性具有重要的意义。虽然我们可以将它们存储于资源文件中,并且ASP.NET的ValidationAttribute也对这种方式提供了原生的支持。但是资源文件的每个条目仅仅是简单的键-值对,只能存储消息的文本值而已,在我们的项目开发中使用的是专门的一个维护消息的组件。在这篇文章中将会通过扩展现有的ValidationAttribute特性让ASP.NET MVC应用可以使用我们的消息组件来获取验证消息。[源代码从这里下载]

  一、ExtendedValidationAttribute

  我们通过如下一个MessageManager来模拟我们独立的消息组件。简单起见,我们通过一个静态字典来维护所有的消息,Key和Value分别代表消息的Id和文本值。从如下的代码可以看出,消息文本可以支持{0}、{1}、…形式表示站位符。GetMessage方法根据指定的消息ID和替换站位符的对象数组格式化一个完成得消息文本。

   1: public class MessageManager
  
2: {
  
3:     static Dictionary<string, string> messages = new Dictionary<string, string>();
  
4:     static MessageManager()
  
5:     {
  
6:         messages.Add("RequiredField", "The \"{0}\" is mandatory!");
  
7:         messages.Add("GreaterThan", "The \"{0}\" must be greater than \"{1}\"!");
  
8:         messages.Add("LessThan", "The \"{0}\" must be less than \"{1}\"!");
  
9:     }
  
10:     public string GetMessage(string messageId, params object[] args)
  
11:     {
  
12:         return string.Format(CultureInfo.CurrentCulture, messages[messageId], args);
  
13:     }
  
14:     public static MessageManager Current = new MessageManager();
  
15: }

  通过直接继承ValidationAttribute的方式,我们定义了如下一个ExtendedValidationAttribute。我们仅仅定义了一个将消息ID和替换站位符的对象数组作为参数的构造函数,而该构造函数直接调用基类包含Func参数的构造函数。至于用于获取验证消息Func对象,则使用调用MessageManager的GetMessage方法来构建。

   1: public class ExtendedValidationAttribute : ValidationAttribute
  
2: {
  
3:     public ExtendedValidationAttribute(string messageId, params object[] args):
  
4:         base(()=>MessageManager.Current.GetMessage(messageId,args))
  
5:     {            
  
6:     }
  
7: }

   二、扩展的RequiredAttribute和RangeAttribute

  接下来我们来演示如何定义具体的ValidationAttribute,我们以用于验证必需字段/属性和值范围的RequiredAttribute和RangeAttribute为例。下面是我们自定义的RequiredAttribute和RangeAttribute,这里使用了一个比较讨巧的方式:直接调用System.ComponentModel.DataAnnotations.RequiredAttribute和System.ComponentModel.DataAnnotations.RangeAttribute的IsValid方法来实施验证。

   1: [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)]
  
2: public class RequiredAttribute : ExtendedValidationAttribute
  
3: {
  
4:     public bool AllowEmptyStrings { get; set; }
  
5:     public RequiredAttribute(string messageId, params object[] args) :
  
6:         base(messageId,args)
  
7:     {}
  
8:     public override bool IsValid(object value)
  
9:     {
  
10:         return new System.ComponentModel.DataAnnotations.RequiredAttribute {AllowEmptyStrings = this.AllowEmptyStrings }.IsValid(value);
  
11:     }
  
12: }
  
13: [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)]
  
14: public class RangeAttribute : ExtendedValidationAttribute
  
15: {
  
16:     private System.ComponentModel.DataAnnotations.RangeAttribute innerRangeAttribute;  
  17:     public RangeAttribute(double minimum, double maximum, string messageId, params object[] args) :
  
18:         base(messageId, args)
  
19:     {
  
20:         innerRangeAttribute = new System.ComponentModel.DataAnnotations.RangeAttribute(minimum, maximum);
  
21:     }
  22:     public RangeAttribute(int minimum, int maximum, string messageId, params object[] args):
  
23:         base(messageId, args)
  
24:     {
  
25:         innerRangeAttribute = new System.ComponentModel.DataAnnotations.RangeAttribute(minimum, maximum);
  
26:     } 
  
27:     public RangeAttribute(Type type, string minimum, string maximum,string messageId, params object[] args) :
  
28:         base(messageId, args)
  
29:     {
  
30:         innerRangeAttribute = new System.ComponentModel.DataAnnotations.RangeAttribute(type, minimum, maximum);
  
31:     }
  
32:
  
33:     public override bool IsValid(object value)
  
34:     {
  
35:         return innerRangeAttribute.IsValid(value);
  
36:     }
  
37: }

 

0
相关文章