zoukankan      html  css  js  c++  java
  • 【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;
    }
  • 相关阅读:
    轮叫调度(RoundRobin Scheduling)
    Python的Daemon管理器zdaemon
    How do you select a particular option in a SELECT element in jQuery? Stack Overflow
    元宵爬虫YuanXiaoSpider
    python 异步采集,网页爬虫编写 | 一步一步学python
    吉林省明日科技有限公司
    简单分析C之Curl模块同php的curl和python的pycurl模块的关系
    fputs
    v专用链接破解器 专用链接破解器
    crawler jd
  • 原文地址:https://www.cnblogs.com/wangwust/p/6385148.html
Copyright © 2011-2022 走看看