写一个继承与ValidationAttribute类的自定义的验证方法

MVC中传递数据时,大多数都会用Model承载数据,并且在传到控制器后,对Model进行一系列的验证

我平时经常使用的判断方法比Low,因为Model都是不同的,也需要返回很多不同的信息,所以我都是把很多条件语句封装成私有方法,放在控制器的最下边,然后使用的时候直接调用。

下图就是我平时使用的代码格式,我把验证方法都写在了这里,很低级请轻喷。

其实在.Net MVC中,已经提供了很好的验证方法,就是在属性上面加ValidationAttribute标签的方法,如下图:

如果想要自定义验证的话就需要自己重写一下,下面是我写的简单自定义的验证方法

方法功能是对字符串形式的属性长度的验证。方法如下

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5.  
  6. using System.ComponentModel.DataAnnotations;
  7.  
  8. namespace WebTest.Common.Utility
  9. {
  10. public class ValidateStrLengthAttribute : ValidationAttribute
  11. {
  12. public ValidateStrLengthAttribute(int minLength, int maxLength)
  13. {
  14. _minLength = minLength;
  15. _maxLength = maxLength;
  16. }
  17.  
  18. /// <summary>
  19. /// 最小值
  20. /// </summary>
  21. private int _minLength = ;
  22.  
  23. /// <summary>
  24. /// 最大值
  25. /// </summary>
  26. private int _maxLength = ;
  27.  
  28. /// <summary>
  29. /// 重写验证规则
  30. /// </summary>
  31. /// <param name="value">model中此属性的值(这里是登录密码的值)</param>
  32. /// <param name="validationContext"></param>
  33. /// <returns></returns>
  34. protected override ValidationResult IsValid(object value, ValidationContext validationContext)
  35. {
  36. string name = validationContext.DisplayName;//属性名称
  37. string errorMessage = "";//错误信息
  38.  
  39. if (value == null)
  40. {
  41. errorMessage = " " + name + "不能为空";
  42. }
  43. else
  44. {
  45. string val = value.ToString();
  46.  
  47. if (string.IsNullOrEmpty(val))
  48. {
  49. errorMessage = " " + name + "不能为空";
  50. }
  51. else
  52. {
  53. if (val.Length >= _minLength && val.Length <= _maxLength)
  54. {
  55. return ValidationResult.Success;
  56. }
  57. else
  58. {
  59. errorMessage = " " + name + " 长度需在" + _minLength + "到" + _maxLength + "之间";
  60. }
  61. }
  62. }
  63. return new ValidationResult(errorMessage);
  64. }
  65.  
  66. }
  67. }

下面我写一个小例子验证我的方法是否可用
登录为例。

Model代码:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5.  
  6. using System.ComponentModel.DataAnnotations;
  7.  
  8. namespace WebTest.Models
  9. {
  10. public class LoginModel
  11. {
  12. /// <summary>
  13. /// 用户名
  14. /// </summary>
  15. [Display(Name = "用户名")]
  16. public string UserName { get; set; }
  17.  
  18. /// <summary>
  19. /// 密码
  20. /// </summary>
  21. [Display(Name = "密码")]
  22. public string Pwd { get; set; }
  23. }
  24. }

控制器代码:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Web.Mvc;
  6.  
  7. using WebTest.Models;
  8.  
  9. namespace WebTest.Controllers
  10. {
  11. public class LoginController : Controller
  12. {
  13.  
  14. public ActionResult Index()
  15. {
  16. return View();
  17. }
  18.  
  19. /// <summary>
  20. /// 登录表单提交
  21. /// </summary>
  22. /// <param name="model"></param>
  23. /// <returns></returns>
  24. [HttpPost]
  25. public ActionResult Index(LoginModel model)
  26. {
  27. return View();
  28. }
  29. }
  30. }

视图页代码:

  1. @model WebTest.Models.LoginModel
  2. @{
  3. Layout = null;
  4. }
  5.  
  6. <!DOCTYPE html>
  7. <html>
  8. <head>
  9. <meta name="viewport" content="width=device-width" />
  10. <title>Index</title>
  11. </head>
  12. <body>
  13. <div>
  14. @using (@Html.BeginForm())
  15. {
  16. @Html.LabelFor(model => model.UserName)
  17. @Html.TextBoxFor(model => model.UserName)
  18. @Html.ValidationMessageFor(model => model.UserName)
  19. <br />
  20. @Html.LabelFor(model => model.Pwd)
  21. @Html.TextBoxFor(model => model.Pwd)
  22. @Html.ValidationMessageFor(model => model.Pwd)
  23. <div>
  24. <input type="submit" value="提交" />
  25. </div>
  26. }
  27. </div>
  28. </body>
  29. </html>

最后出来的页面是这样子的(普通的form表单)

现在我可以把我的标签放到属性的上边方法名是ValidateStrLengthAttribute  标签名称是ValidateStrLength)需要引用下自定义验证方法的命名空间

如下图:

代码:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5.  
  6. using System.ComponentModel.DataAnnotations;
  7. using WebTest.Common.Utility;
  8.  
  9. namespace WebTest.Models
  10. {
  11. public class LoginModel
  12. {
  13. /// <summary>
  14. /// 用户名
  15. /// </summary>
  16. [Display(Name = "用户名")]
  17. [ValidateStrLength(, )]
  18. public string UserName { get; set; }
  19.  
  20. /// <summary>
  21. /// 密码
  22. /// </summary>
  23. [Display(Name = "密码")]
  24. [ValidateStrLength(, )]
  25. public string Pwd { get; set; }
  26. }
  27. }

现在都写完了,点击提交试一下

例子完毕,如有问题,请多指正^_^。

在.Net MVC中自定义ValidationAttribute标签对Model中的属性做验证的更多相关文章

  1. 在Asp.Net MVC中实现RequiredIf标签对Model中的属性进行验证

    在Asp.Net MVC中可以用继承ValidationAttribute的方式,自定制实现RequiredIf标签对Model中的属性进行验证 具体场景为:某一属性是否允许为null的验证,要根据另 ...

  2. 在Asp.Net MVC中实现CompareValues标签对Model中的属性进行验证

    在Asp.Net MVC中可以用继承ValidationAttribute的方式,自定制实现Model两个中两个属性值的比较验证 具体应用场景为:要对两个属性值的大小进行验证 代码如下所示: /// ...

  3. CompareValues标签对Model中的属性进行验证

    在Asp.Net MVC中实现CompareValues标签对Model中的属性进行验证   在Asp.Net MVC中可以用继承ValidationAttribute的方式,自定制实现Model两个 ...

  4. 6.2 dubbo在spring中自定义xml标签源码解析

    在6.1 如何在spring中自定义xml标签中我们看到了在spring中自定义xml标签的方式.dubbo也是这样来实现的. 一 META_INF/dubbo.xsd 比较长,只列出<dubb ...

  5. 6.1 如何在spring中自定义xml标签

    dubbo自定义了很多xml标签,例如<dubbo:application>,那么这些自定义标签是怎么与spring结合起来的呢?我们先看一个简单的例子. 一 编写模型类 package ...

  6. mvc中动态给一个Model类的属性设置验证

    原文:mvc中动态给一个Model类的属性设置验证 在mvc中有自带的验证机制,比如如果某个字段的类型是数字或者日期,那么用户在输入汉字或者英文字符时,那么编译器会自动验证并提示用户格式不正确,不过这 ...

  7. Android中自定义ListView无法响应OnItemClickListener中的onItemClick方法问题解决方案

    如果你的自定义ListViewItem中有Button或者Checkable的子类控件的话,那么默认focus是交给了子控件,而ListView 的Item能被选中的基础是它能获取Focus,也就是说 ...

  8. oracle中自定义type、以及java中传递list到过程中的例子

    在java开发过程中有时候为了处理数据的速度更快,会把要处理的数据组装成list,把list作为过程的一个参数,在过程中批量处理,下面就以一个例子做简单的阐述,以此谨记. --药品目录智能审核 --说 ...

  9. spring mvc 中自定义404页面在IE中无法显示favicon.ico问题的解决方法。

    此处用的是jsp,控制层用的是ModelAndView, 具体解决方法如下: @RequestMapping(value = "notfound", method = Reques ...

随机推荐

  1. Redis系统学习 三、使用数据结构

    前言:上一章,简单介绍了5种数据结构,并给出了一些用例.现在是时候来看看一些高级的,但依然很常见的主题和设计模式 一.大O表示法(Big O Notation ) 常用时间复杂度O(1)被认为是最快速 ...

  2. JavaScript 实现文本编辑器

    JavaScript 实现文本编辑器 最近,我需要做一个非常基本的网页内容编辑功能.我不想使用 iframe ,我也不想要一个功能特别多的复杂编辑器,只需要很基本的内容编辑功能,例如粗体,斜体,列表, ...

  3. 简单2步实现 asp.net mvc ckeditor 图片上传

    1.打开ckeditor 包下的  config.js,添加一句 配置(PS:ckeditor 很多功能都在该配置文件里配置),如下: config.filebrowserImageUploadUrl ...

  4. MacOSX 中如何动态隐藏Dock Icon

    XCode创建了一个GUI工程,程序分几种运行模式,一种是agent模式,还有一种是GUI界面.Agent模式是没有界面的GUI程序,通过LaunchAgents启动.创建出来的Info.plist默 ...

  5. jquery 表单 清空

    做了个复杂查询的页面,字段太多了,填了一次,想清空挺麻烦的 $('#myform')[0].reset(); 虽然reset方法可以做到一部分,但是如果你有个元素是这样的 <input name ...

  6. hdu 1068

    找出没有缘分的同学,如果有缘分的建边, 就是求最大独立集问题了 #include<stdio.h> #include<string.h> int n,m,ma[1050][10 ...

  7. Sql Server (错误:7302)

    windows server 2008 x64 sql server 2008 r2 OraClient 11g 错误提示: 解决办法:

  8. 设计模式(二)-- 外观模式(Facade)

    设计模式(二) 外观模式(Facade) 为了解决子系统外部的客户端在使用子系统的时候,既能简单地使用这些子系统内部的模块功能,而又不用客户端去与子系统内部的多个模块交互的问题. 为子系统中的一组接口 ...

  9. crudandroidandroid——CRUD(在上一篇博客的基础上)

    废话就不多说了,开始... 1.Person package com.njupt.sqlite; public class Person { private Integer id; private S ...

  10. spi数据KL25用SPI操作nor flash

    最近研究spi数据,稍微总结一下,以后继续补充: KL25的SPI连接一个nor flash.该flash型号为FM25F04,支撑SPI的模式0和模式3,要求高位先发送,在上升沿采集数据. 通常,S ...