【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;
}

 

posted @ 2017-02-10 10:09  wangwust  阅读(252)  评论(0编辑  收藏  举报