本文参考: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("订单号", , MinLength = , 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;
}

【ASP.NET MVC 学习笔记】- 02 Attribute的更多相关文章

  1. ASP.NET MVC学习笔记-----Filter

    ASP.NET MVC学习笔记-----Filter(1) Filter类型 接口 MVC的默认实现 Description Authorization IAuthorizationFilter Au ...

  2. ASP.NET MVC 学习笔记-2.Razor语法 ASP.NET MVC 学习笔记-1.ASP.NET MVC 基础 反射的具体应用 策略模式的具体应用 责任链模式的具体应用 ServiceStack.Redis订阅发布服务的调用 C#读取XML文件的基类实现

    ASP.NET MVC 学习笔记-2.Razor语法   1.         表达式 表达式必须跟在“@”符号之后, 2.         代码块 代码块必须位于“@{}”中,并且每行代码必须以“: ...

  3. ASP.NET MVC学习笔记-----Filter2

    ASP.NET MVC学习笔记-----Filter(2) 接上篇ASP.NET MVC学习笔记-----Filter(1) Action Filter Action Filter可以基于任何目的使用 ...

  4. ASP.NET MVC学习笔记-----Filter(2)

    接上篇ASP.NET MVC学习笔记-----Filter(1) Action Filter Action Filter可以基于任何目的使用,它需要实现IActionFilter接口: public ...

  5. ASP.NET MVC 学习笔记-7.自定义配置信息 ASP.NET MVC 学习笔记-6.异步控制器 ASP.NET MVC 学习笔记-5.Controller与View的数据传递 ASP.NET MVC 学习笔记-4.ASP.NET MVC中Ajax的应用 ASP.NET MVC 学习笔记-3.面向对象设计原则

    ASP.NET MVC 学习笔记-7.自定义配置信息   ASP.NET程序中的web.config文件中,在appSettings这个配置节中能够保存一些配置,比如, 1 <appSettin ...

  6. ASP.NET MVC学习笔记-----ActionInvoker

    还是这张图: 当ControllerFactory生成Controller实例后,这时就需要使用ActionInvoker来选择调用一个合适的Action执行.ASP.NET MVC提供的基类Cont ...

  7. ASP.NET MVC 学习笔记(1)

    从头开始系统地学习ASP.NET MVC 为什么要学习ASP.NET MVC?原因很多,可以先来看一下最早的ASP.NET WebForm的一些缺点: 传说中面试经常要问到的ASP.NET WebFo ...

  8. ASP.NET MVC学习笔记(一) 从路由开始创建mvc

    之前一篇写一半发现版本太老了,是基于mvc2的. 两本参考书编写的顺序各方面都不太一样.决定重新写一篇. 我这篇文章基于mvc5,vs2015 参考书:Will保哥的ASP.NET MVC4开发指南 ...

  9. ASP.NET MVC学习笔记-----Filter(1)

    Filter类型 接口 MVC的默认实现 Description Authorization IAuthorizationFilter AuthorizeAttribute 最先执行,在其他类型的fi ...

随机推荐

  1. php使用ZipArchive压缩文件的心得

    $zip=new ZipArchive; if($zip->open('test.zip',ZipArchive::CREATE)===TRUE){ $zip->addFile('imag ...

  2. 银河麒麟操作系统打开VMware报vmmon无法编译

    使用银河麒麟操作系统打开VMware可能会报vmmon无法编译 这个时候... 将/usr/src/linux-headers-xxx/include/miscdevice.h第71行void改为in ...

  3. Servlet第一篇【介绍Servlet、HTTP协议、WEB目录结构、编写入门Servlet程序、Servlet生命周期】

    什么是Serlvet? Servlet其实就是一个遵循Servlet开发的java类.Serlvet是由服务器调用的,运行在服务器端. 为什么要用到Serlvet? 我们编写java程序想要在网上实现 ...

  4. Python学习笔记013_正则表达式

    Python中的正则表达式是通过 re 模块实现的. 通配符 .  表示除了换行以外的任何字符; 编写正则表达式时使用  r're'  , r + 正则表达式内容 >>> impor ...

  5. day09<面向对象+>

    面向对象(多态的概述及其代码体现) 面向对象(多态中的成员访问特点之成员变量) 面向对象(多态中的成员访问特点之成员方法) 面向对象(多态中的成员访问特点之静态成员方法) 面向对象(超人的故事) 面向 ...

  6. C++代码使用 CppUnit 进行单元检测

    CppUnit是一个很方便的对C++代码进行单元检测的工具. 如何编译CppUnit参照博客:http://blog.csdn.net/x_iya/article/details/8433716 该博 ...

  7. E2195 cannot evaluate function call

    E2195 cannot evaluate function call :e2195无法评估函数的调用     :问题的根源在于,对组件创建了不合理的触发事件导致的.    :OK

  8. Django 1.10中文文档-执行查询

    Django 1.10中文文档: https://github.com/jhao104/django-chinese-doc 只要创建好 数据模型, Django 会自动为生成一套数据库抽象的API, ...

  9. MySQL Base

    /* 连接与断开服务器 */ mysql -h 地址 -P 端口 -u 用户名 -p 密码 ---> input pwd /* 数据库存贮引擎 */    InnoDB :        1) ...

  10. MongoDB学习教程(1)

    1.简介: MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统.在高负载的情况下,添加更多的节点,可以保证服务器性能.MongoDB 旨在为WEB应用提供可扩展的高性能数据 ...