MVC模型验证

原创 2015年11月19日 16:28:32

前言:

无论你编写什么样的网页程序,都需要对用户的数据进行验证,以确数据的有效性和完整性。

ASP.NET MVC3允许你采用一种被称之为“数据注释”的方式来进行数据验证,这种验证包含了客户端浏览器

和服务器端的双重验证。或许你会问为什么要进行两次验证?首先,客户端验证能够直接响应客户,减少了服务

器压力的同时还提高了用户体验,但是你永远不能信任来自客户端的信息(用户可以关闭浏览器的脚本功能,

让你的js验证彻底不起作用),所以服务器端验证也是必须的。

1,常规验证(必填字段、字符串长度、正则表达式验证、范围验证<数值、日期>)

先看一个添加界面的反馈的错误信息

image_thumb2

 

 

实体类代码如下:

/// <summary>
/// 员工信息
/// </summary>
public class StaffInfo
{
    public virtual int StaffInfoId { get; set; }

    [Required]
    [Display(Name = "登录账号")]
    public virtual string LogID { get; set; }

    [StringLength(10, MinimumLength = 4, ErrorMessage = "{0}的长度必须大于{2}个字符并小于{1}个字符")]
    [Display(Name = "密码")]
    public virtual string LogPassword { get; set; }

    [StringLength(10, ErrorMessage = "{0}的长度不能大于{1}个字符")]
    [Display(Name = "姓名")]
    public virtual string RealName { get; set; }

    [Display(Name = "出生日期")]
    //[Range(typeof(DateTime), "2011-12-31", "1950-1-1", ErrorMessage = "{0}的范围是{1}到{2}")]
    public virtual DateTime Birthday { get; set; }

    [RegularExpression(@"\d{17}[\d|X]|\d{15}", ErrorMessage = "{0}的格式不正确")]
    [Display(Name = "身份证号码")]
    public virtual string IdentityNo { get; set; }

    [RegularExpression(@"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}", ErrorMessage = "{0}的格式不正确")]
    [Display(Name = "邮箱")]
    public virtual string Email { get; set; }

    [Display(Name = "逻辑删除标识")]
    public virtual int IsLogicDelete { get; set; }
}

 

其中,Required代表必填字段,

StringLength代表字符串长度,

RegularExpression代表正则表达式验证

Range代表范围验证<整数、浮点数、日期>

这4中验证方式可以满足我们常见的验证要求。

使用常规验证请引入命名空间:

using System.ComponentModel.DataAnnotations;

 

下面我们来验证一下MVC是否进行了客户端和服务器端的双重验证,

首先,我们关闭IE浏览器的脚本功能。

菜单->Internet选项,打开如下界面所示:

 

image_thumb5

 

单击“自定义级别…”按钮,弹出如下界面:
找到“脚本”->“活动脚本”,选择“禁用”,“确定”。

 

image_thumb7

 

在看看我们呢禁用脚本后的界面,由于禁用了脚本,连界面的样式都发生了变化,

但是服务器端还是验证了所有数据并返回 了错误信息,如下图所示:

 

image_thumb11

 

我们可以看到状态栏上,客户端发送请求的过程

 

image_thumb12

 

2,附加验证(服务器端Json验证、比较验证)

使用附加验证请引入命名空间:

using System.Web.Mvc

  为了演示这两个扩展的验证方法,我们新建一个实体类:

public class StaffInfoEx
{
    public virtual int StaffInfoExId { get; set; }

    [Required]
    //其中StaffInfoEx是控制器的名称,CheckLogId是验证方法
    [Remote("CheckLogId", "StaffInfoEx", ErrorMessage = "登录账号已经被占用,请改用其他账号")]
    [Display(Name = "登录账号")]
    public virtual string LogID { get; set; }

    [StringLength(10, MinimumLength = 4, ErrorMessage = "{0}的长度必须大于{2}个字符并小于{1}个字符")]
    [Display(Name = "密码")]
    public virtual string LogPassword { get; set; }

    [Display(Name = "确认密码")]
    [Compare("LogPassword", ErrorMessage = "密码必须一致")]
    public virtual string LogPasswordConfirm { get; set; }

    [Display(Name = "姓名")]
    public virtual string RealName { get; set; }
}

 

这里请注意确保Remote声明的控制器名称、验证方法名称拼写正确,否则会导致Create按钮没有响应。

 

2.1 Remote,服务器端Json验证

 

image_thumb17

请修改URL为:http://localhost:XXXX/staffinfoex。正如实体类中声明的一样,

我们只需要控制类StaffInfoExController中添加如下Json方法就行:

 

      //验证登录账号是否已经被占用
        public JsonResult CheckLogId(string logid)
        {
            var result = db.StaffInfoEx.Count(u => u.LogID == logid) == 0;
            return Json(result, JsonRequestBehavior.AllowGet);
        }

 

当登录账号字段失去焦点时,会自动调用服务器端json方法验证账号的使用情况。

也就是说Remote声明并没有采用客户端验证,而是直接进行了异步的服务器端验证。

因为像是登录账号这类信息,你没法在客户端进行验证,除非你把所有的登录账号都

发送到客户端。

 

2.2 Compare,比较验证

 

image_thumb15

 

只是在实体类中进行了简单的声明,就可以很好的实现类似密码确认的功能,

ASP.NET MVC真的是太给力了。

 

  
[Display(Name = "确认密码")]
  [Compare("LogPassword", ErrorMessage = "密码必须一致")]
  public virtual string LogPasswordConfirm { get; set; }

 


3,数据库约束验证

此外我们还能使用各种数据库约束验证来保证数据的有效性和完整性。

如果不希望用户使用123456这样的过于简单的密码,我们可以使用check约束

来实现:

 

ALTER TABLE staffinfoes WITH NOCHECK 
ADD CONSTRAINT chk_logPassword
CHECK (logPassword NOT IN('123','123123','123456'))

 

其中,staffinfoes是表名称,chk_logPassword是约束名称,logPassword是列名称。

先在我们来添加一个StaffInfo,密码为123456,看看我们的程序会出现什么情况?

image_thumb9

错误信息:

INSERT 语句与 CHECK 约束"chk_logPassword"冲突。

该冲突发生于数据库"BingoMvc3DataAnnotations",表"dbo.StaffInfoes", column 'LogPassword'。
语句已终止。

 

最后,我们总结一下这三种数据验证方式

1)客户端脚本验证,使用javascript等脚本进行验证,但是这种验证可以轻易的被屏蔽。但是它却能够

提供最好用户体验。

2)服务器端验证,需要回发给服务器验证,可以确保数据在客户端活动脚本被禁用时依然进行数据

证。缺点是增加了服务器压力。

3)数据库约束验证,这是一种特殊解决办法,比如网站在运行过程中你没法更新网站。所有的压力

都在数据库上,过多的约束会影响网站的响应速度。


MVC 模型常见验证

引用命名空间 using System.ComponentModel.DataAnnotations;
  • SpringFileld
  • SpringFileld
  • 2014年08月05日 16:53
  • 725

ASP.NET MVC Model验证(五)

上篇主要讲解ModelValidatorProvider 和ModelValidator两种类型的自定义实现, 然而在MVC框架中还给我们提供了其它方式来进行Model验证,也就是本篇的主题,使用框架...
  • JinYuan0829
  • JinYuan0829
  • 2014年07月15日 20:32
  • 1980

向MVC的Model中添加验证

向MVC的Model中添加验证特性:MVC的服务端验证流程是这样的: 客户端请求—>Route解析—> model绑定—> 数据验证.举个栗子:public class Model { pu...
  • G_Q_L
  • G_Q_L
  • 2017年08月16日 12:11
  • 405

Asp.net MVC中 model 验证方式 ajax +jquery

在项目开发中,最常见的莫过注册,登录,而这其中最常见的莫过于验证了。良好的验证界面会很好的提高用户体验度。 asp.net mvc验证提供了前台的ajax验证方式, 1.非空验证 非空验...
  • qq1162195421
  • qq1162195421
  • 2013年08月17日 11:26
  • 2786

MVC4中如何跳过对模型中某个属性的验证?

模型: 1 public class User 2 { 3 [Required(ErrorMessage="用户名不能为空")] 4 public...
  • lxrj2008
  • lxrj2008
  • 2017年09月08日 13:13
  • 144

asp.net mvc Model验证总结及常用正则表达式

关于Model验证官方资料: http://msdn.microsoft.com/zh-cn/library/system.componentmodel.dataannotations.aspx  ...
  • limfungsuen
  • limfungsuen
  • 2015年07月25日 17:24
  • 484

mvc 模型验证及正则表达式

http://www.wyjexplorer.cn/Post/2012/8/3/model-validation-in-aspnet-mvc3 ASP.NET MVC3中的Model是自验证的,...
  • shengxupeng
  • shengxupeng
  • 2015年06月24日 16:57
  • 3370

MVC 3 数据验证 Model Validation 详解

随笔- 61  文章- 2  评论- 611  MVC 3 数据验证 Model Validation 详解 继续我们前面所说的知识点进行下一个知识点的...
  • weizhiai12
  • weizhiai12
  • 2014年07月09日 22:31
  • 7380

mvc 模型验证问题总结

昨天遇到一个问题,很小的问题解决了好长时间。实际上是个低级错误。 在model里面写了一个sex属性为int类型,因为直接拷贝的之前的代码,所以就给这个属性添加了一个stringlength验证。结...
  • wongcony
  • wongcony
  • 2016年03月18日 10:12
  • 366

创建ASP.NET Core MVC应用程序(6)-添加验证

创建ASP.NET Core MVC应用程序(6)-添加验证DRY原则DRY(“Don’t Repeat Yourself”)是MVC的设计原则之一。ASP.NET MVC鼓励你只定义一次功能或行为,...
  • CharlieThinker
  • CharlieThinker
  • 2016年12月02日 15:50
  • 738
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MVC模型验证
举报原因:
原因补充:

(最多只允许输入30个字)