【ASP.NET MVC 学习笔记】- 02 Attribute
本文参考:http://www.cnblogs.com/willick/p/3208427.html
1、特性(Attribute)对程序中的元素进行标注,比如类、字段、方法、属性等。
2、在.NET Remoting的远程对象中,若要传递或调用某个对象,则该对象所属的类则必须标注[Serializable]。
3、在构建XML Web服务时,使用[WebMethod]特性让通过Http请求的的返回值编码成XML进行传递。
4、下列示例模拟ASP.NET MVC中的[StringLength]特性:
- StringLength特性定义
/// <summary> /// 自定义的带有可选命名参数的 StringLenthAttribute 特性类。 /// 该特性通过AttributeUsage限制它只能用在属性和字段上。 /// </summary> [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property)] public sealed class StringLengthAttribute : Attribute { public StringLengthAttribute(string displayName, int maxLength) { this.MaxLength = maxLength; this.DisplayName = displayName; } /// <summary> /// 显示的名称,对外是只读的,所以不能通过可选参数来赋值,必须在构造函数中对其初始化。 /// </summary> public string DisplayName { get; private set; } /// <summary> /// 长度最大值,对外是只读的,所以不能通过可选参数来赋值,必须在构造函数中对其初始化。 /// </summary> public int MaxLength { get; private set; } /// <summary> /// 错误信息,标注时可作为可选命名参数来使用。 /// </summary> public string ErrorMessage { get; set; } /// <summary> /// 长度最小值,标注时可作为可选命名参数来使用。 /// </summary> public int MinLength { get; set; } }
- StringLength特性应用
/// <summary> /// 应用自定义MyStringLenth特性于Order类的OrderID属性之上。MinLength和ErrorMessage是命名参数。 /// </summary> public class Order { [StringLength("订单号", 6, MinLength = 3, ErrorMessage = "{0}的长度必须在{1}和{2}之间,请重新输入!")] public string OrderID { get; set; } }
- StringLength特性验证
static void Main(string[] args) { string input; Order order; do { Console.WriteLine("请输入订单号:"); input = Console.ReadLine(); order = new Order { OrderID = input }; } while (!IsValid(order)); Console.WriteLine("订单号输入正确,按任意键退出!"); Console.ReadKey(); } /// <summary> /// 验证输入是否合法 /// </summary> /// <param name="order"></param> /// <returns></returns> private static bool IsValid(Order order) { if (order == null) return false; return typeof(Order).GetProperties().All(p => IsMemberValid(order.OrderID.Length, p)); } /// <summary> /// 检查成员字符串长度是否越限。 /// </summary> /// <param name="inputLength"></param> /// <param name="member"></param> /// <returns></returns> private static bool IsMemberValid(int inputLength, MemberInfo member) { foreach (object attribute in member.GetCustomAttributes(true)) { if (!(attribute is StringLengthAttribute)) continue; StringLengthAttribute attr = (StringLengthAttribute)attribute; string displayName = attr.DisplayName; int maxLength = attr.MaxLength; int minLength = attr.MinLength; string msg = attr.ErrorMessage; if (inputLength < minLength || inputLength > maxLength) { Console.WriteLine(msg, displayName, minLength, maxLength); return false; } else { return true; } } return false; }