Model验证是ASP.NET MVC中的重要部分,它主要用于判断输入的数据类型及值是否符合我们设定的规则,这篇文章就介绍下ASP.NET MVC中Model验证的几种方式。

后台验证

DataAnnotation

DataAnnotation翻译过来是“数据注解”的意思,DataAnnotation命名空间中包含一些用于验证Model的特性,如:RequiredAttribute,CompareAttribute,DisplayAttribute等,我们在创建Model时,将相应的特性性标注到字段上即可实现数据验证。

创建Model:

  1. public class Person
  2. {
  3. [Display(Name = "姓名")]
  4. [Required(ErrorMessage = "姓名是必须的!")]
  5. public string Name { set; get; }
  6. [Display(Name = "姓名")]
  7. public int Age { set; get; }
  8. }

View中的代码:

  1. @model EBuy.Website.Models.Person
  2. @{
  3. Layout = null;
  4. }
  5.  
  6. <!DOCTYPE html>
  7.  
  8. <html>
  9. <head>
  10. <meta name="viewport" content="width=device-width" />
  11. <title>Index</title>
  12. </head>
  13. <body>
  14. <div>
  15. <h3 style="color:red;">
  16. @Html.ValidationSummary()
  17. </h3>
  18. </div>
  19. <div>
  20. @using (Html.BeginForm("evaluate", "home", "Post"))
  21. {
  22. @Html.LabelFor(Model => Model.Name)
  23. @Html.TextBoxFor(Model => Model.Name)
  24. @Html.LabelFor(Model => Model.Age)
  25. @Html.TextBoxFor(Model => Model.Age)
  26. <input type="submit" value="提交" />
  27. }
  28. </div>
  29. </body>
  30. </html>

Controller中的代码:

  1. public class HomeController : Controller
  2. {
  3. public ActionResult Index()
  4. {
  5. return View();
  6. }
  7.  
  8. public ActionResult Evaluate(Person person)
  9. {
  10. if (ModelState.IsValid)
  11. {
  12. return Content("evaluate success!");
  13. }
  14. return View("Index", person);
  15. }
  16. }

运行程序:

注意,Age属性上并未标注RequiredAttribute,却依然提示Age字段必须,这是因为Age是int类型,int类型不能为null,对于不能为null的类型,ASP.NET MVC默认为是必须的。除此之外,ASP.NET MVC还会帮助我们进行数据类型的验证,如,若在年龄一栏输入非整数,那么验证将不会通过,且会提示数值不合法。

ValuationAttribute

除了使用DataAnnotation中预定义的一些特性进行数据验证外,我们还可以自定义一些验证特性。这里我们通过覆写DataAnnotation命名空间中ValudationAttribute类的IsValid方法来实现自定义验证。示例代码如下:

  1. public class CheckAgeAttribute : ValidationAttribute
  2. {
  3. private int _minage;
  4. public CheckAgeAttribute(int minAge)
  5. {
  6. _minage = minAge;
  7. }
  8. public override bool IsValid(object value)
  9. {
  10. if (value is int)
  11. {
  12. var age = value as int?;
  13. if (age == null)
  14. {
  15. return false;
  16. }
  17. if (age < _minage)
  18. {
  19. return false;
  20. }
  21. return true;
  22. }
  23. return false;
  24. }
  25.  
  26. public override string FormatErrorMessage(string name)
  27. {
  28. return base.FormatErrorMessage(name);
  29. }
  30. }

标注特性:

  1. public class Person
  2. {
  3. [Display(Name = "姓名")]
  4. [Required(ErrorMessage = "姓名是必须的!")]
  5. [MaxLength(, ErrorMessage = "太长了")]
  6. public string Name { set; get; }
  7. [Display(Name = "年龄")]
  8. [CheckAge(, ErrorMessage = "年纪太小!")]
  9. public int Age { set; get; }
  10. }

然后运行程序:

IValidatableObject

通过实现IValidatableObject接口进行数据的验证,示例代码如下:

  1. public class Person : IValidatableObject
  2. {
  3. [Display(Name = "姓名")]
  4. public string Name { set; get; }
  5. [Display(Name = "年龄")]
  6. public int Age { set; get; }
  7.  
  8. public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
  9. {
  10. Person person = validationContext.ObjectInstance as Person;
  11. if (person == null)
  12. {
  13. yield break;
  14. }
  15. if (string.IsNullOrEmpty(person.Name))
  16. {
  17. yield return new ValidationResult("您贵姓?");
  18. }
  19. if (person.Age < )
  20. {
  21. yield return new ValidationResult("太年轻了!");
  22. }
  23. }
  24. }

运行程序:

IDataErrorInfo

实现IDataErrorInfo接口也可以进行数据的验证,示例代码如下:

  1. public class Person : IDataErrorInfo
  2. {
  3. [Display(Name = "姓名")]
  4. public string Name { set; get; }
  5. [Display(Name = "年龄")]
  6. public int Age { set; get; }
  7.  
  8. public string this[string columnName]
  9. {
  10. get
  11. {
  12. switch (columnName)
  13. {
  14. case "Name":
  15. if (string.IsNullOrEmpty(Name))
  16. {
  17. return "雁过留声,人过留名";
  18. }
  19. return null;
  20. case "Age":
  21. if (Age < )
  22. {
  23. return "年纪尚轻!";
  24. }
  25. break;
  26. }
  27. return null;
  28. }
  29. }
  30.  
  31. public string Error
  32. {
  33. get
  34. {
  35. //若返回值不是""或null,则不管数据是否合法,则验证都不会通过
  36. //并且会在数据验证成功后显示此处指定的错误信息
  37. return "";
  38. //return "出错啦!";
  39. }
  40. }
  41. }

运行程序:

 
 

前端验证

 

上述验证均是在服务器端进行的,除此之外我们也可以使用js在客户端进行数据的验证。除了我们自己手写js代码外,ASP.NET MVC也提供了前端验证方法,要启用ASP.NET MVC提供的前端验证方法需要在页面中引入三个js文件:

  • jquery-1.10.2.min.js(也可以是其它版本的jQuery)
  • jquery.validate.min.js
  • jquery.validate.unobtrusive.min.js

然后在配置文件中开启客户端验证(默认是开启的):

  1. <configuration>
  2. <appSettings>
  3. <add key="ClientValidationEnabled" value="true"/>
  4. <add key="UnobtrusiveJavaScriptEnabled" value="true"/>
  5. </appSettings>
  6. </configuration>

注意:若要使ASP.NET MVC提供的前端验证生效,需要对Model进行数据注解(DataAnnotation)。
引用文件之后,运行程序,然后查看页面源代码,可以看到form中的input标签中多出了 data-val 属性以及其它的和数据注解相关的属性。

对于验证失败的信息,我们需要对用户进行相应的提醒。只需要在<form></form>中添加 @Html.ValidationSummary() 即可。

版权声明

本文为作者原创,版权归作者雪飞鸿所有。 转载必须保留文章的完整性,且在页面明显位置处标明原文链接

如有问题, 请发送邮件和作者联系。

ASP.NET MVC5中的Model验证的更多相关文章

  1. ASP.NET MVC4中的Model验证 移除指定验证信息

    MVC中通过Model在页面间传值使的程序开发变得更加的快捷,但是很多时候,我们在数据传递的时候为了确保数据的有效性,要对Model的相关属性做基本的数据验证. 不多说直接上个代码,Model的实体类 ...

  2. ASP.NET MVC中对Model进行分步验证的解决方法

    原文:ASP.NET MVC中对Model进行分步验证的解决方法 在我之前的文章:ASP.NET MVC2.0结合WF4.0实现用户多步注册流程中将一个用户的注册分成了四步,而这四个步骤都是在完善一个 ...

  3. ASP.NET MVC5中的数据注解

    ASP.NET MVC5中Model层开发,使用的数据注解有三个作用: 数据映射(把Model层的类用EntityFramework映射成对应的表) 数据验证(在服务器端和客户端验证数据的有效性) 数 ...

  4. ASP.NET MVC5中的数据注解(转载)

    ASP.NET MVC5中Model层开发,使用的数据注解有三个作用: 数据映射(把Model层的类用EntityFramework映射成对应的表) 数据验证(在服务器端和客户端验证数据的有效性) 数 ...

  5. asp.net mvc5中使用缓存依赖SqlCacheDependency

    缓存是用来提高应用性能,降低服务器压力.适用于数据不易变,数据易通用的情景, 对于动态查询数据,例如数据分析,最好放弃使用缓存.使用缓存最麻烦的就是保持源数据和缓存的中的数据一致. 缓存(Cache) ...

  6. ASP.NET MVC中使用窗体验证出现上下文的模型在数据库创建后发生更改,导致调试失败(一)

    在ASP.NET MVC中使用窗体验证.(首先要明白,验证逻辑是应该加在Model.View和Controller哪一个里面?由于Model的责任就是负责信息访问与商业逻辑验证的,所以我们把验证逻辑加 ...

  7. ASP.NET MVC中默认Model Binder绑定Action参数为List、Dictionary等集合的实例

    在实际的ASP.NET mvc项目开发中,有时会遇到一个参数是一个List.Dictionary等集合类型的情况,默认的情况ASP.NET MVC框架是怎么为我们绑定ASP.NET MVC的Actio ...

  8. asp.net mvc5中的过滤器重写

    asp.net mvc5中增加了一种过滤器类型叫过滤器重写,这种过滤器类型可以在操作或者控制器上忽略更高层次上设置的过滤器类型,它可以重写五种基本的过滤器接口类型:IAuthenticationFil ...

  9. asp.net MVC中的@model与Model

    asp.net MVC中的@model与Model https://blog.csdn.net/ydm19891101/article/details/44301201 在MVC的实际使用中,我们经常 ...

随机推荐

  1. 6.DNS公司PC访问外网的设置 + 主DNS服务器和辅助DNS服务器的配置

    网站部署之~Windows Server | 本地部署 http://www.cnblogs.com/dunitian/p/4822808.html#iis DNS服务器部署不清楚的可以看上一篇:ht ...

  2. ASP.NET Core: You must add a reference to assembly mscorlib, version=4.0.0.0

    ASP.NET Core 引用外部程序包的时候,有时会出现下面的错误: The type 'Object' is defined in an assembly that is not referenc ...

  3. 【需求设计1】VIP积分系统无聊YY

    RT,想到什么就写什么呗,这是最简单的方式,顺便给自己做一个记录,反正自己记忆力也不太好.本文是仿陆金所的积分系统,自己YY的一套东西. 首先我想做一个VIP兑换投资卷的功能: 我们先来确定一些我知道 ...

  4. C# 对象实例化 用json保存 泛型类 可以很方便的保存程序设置

    参考页面: http://www.yuanjiaocheng.net/webapi/test-webapi.html http://www.yuanjiaocheng.net/webapi/web-a ...

  5. addTwoNumbers

    大神的代码好短,自己写的120多行=_= 各种判断 ListNode *f(ListNode *l1, ListNode *l2) { ListNode *p1 = l1; ListNode *p2 ...

  6. GOF23设计模式之单例模式

    ·核心作用: -保证一个类只有一个实例,并且提供一个访问该实例的全局访问点. ·常见应用场景: -Windows的Task Manager(任务管理器)就是很典型的单例模式 -Windows的Recy ...

  7. [AlwaysOn Availability Groups]健康模型 Part 1——概述

    健康模型概述 在成功部署AG之后,跟踪和维护健康状况是很重要的. 1.AG健康模型概述 AG的健康模型是基于策略管理(Policy Based Management PBM)的.如果不熟悉这个特性,可 ...

  8. Set up VLAN (802.1q) tagging on a network interface?

    SOLUTION VERIFIED October 13 2015 KB39674 KB741413 environment Red Hat Enterprise Linux 4 Red Hat En ...

  9. mysql 大表拆分成csv导出

    最近公司有一个几千万行的大表需要按照城市的id字段拆分成不同的csv文件. 写了一个自动化的shell脚本 在/home/hdh 下面 linux-xud0:/home/hdh # lltotal 1 ...

  10. [转]NopCommerce How to add a menu item into the administration area from a plugin

    本文转自:http://docs.nopcommerce.com/display/nc/How+to+code+my+own+shipping+rate+computation+method Go t ...