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;
    }
  • 相关阅读:
    Android AHandle AMessage
    android java 与C 通过 JNI双向通信
    android 系统给应用的jar
    UE4 unreliable 同步问题
    UE4 difference between servertravel and openlevel(多人游戏的关卡切换)
    UE4 Run On owing Client解析(RPC测试)
    UE4 TSubclassOf VS Native Pointer
    UE4 内容示例网络同步Learn
    UE4 多人FPS VR游戏制作笔记
    UE4 分层材质 Layerd Materials
  • 原文地址:https://www.cnblogs.com/wangwust/p/6385148.html
Copyright © 2011-2022 走看看