在mvc中使用表单进行数据提交时,数据验证分为服务器端验证和客户端验证;

我们可以通过使用HtmlHelper中的方法及在页面中引用js库对Model的属性的数据注解(System.ComponentModel.DataAnnotations命名空间下的一组类)进行解析,实现前端、后端的数据验证;

HtmlHelper、数据注解在其他文章中再详细介绍,本文主要介绍如何使数据验证发生作用。

下面分别介绍两种验证方式:

一、服务器端验证

要实现服务器端的验证非常简单,只需要满足下面三个条件:

①有数据注解

②页面部分使用HtmlHelper生成各种表单元素

使用这些html标签的时候,需要引用一下mvc工程中的css文件:

<link href="~/Content/Site.css" rel="stylesheet" />

③在后端代码中指明需要验证

但是只有服务器端的验证不能满足我们,因为每一次的错误数据都会提交到服务器,不仅影响了性能,用户体验也差强人意。

二、客户端验证

客户端验证是通过jquery validate插件进行数据验证的,它需要有jquery的支持,因此在引用它之前必须引用jquery文件。

但jquery validate是需要在js中编写相关代码(如下图),才能实现数据验证的;

但这样子也是挺麻烦的,我们在属性写的数据注解岂不是没什么卵用了,不用担心,只要我们引用一下mvc工程中的 jquery.validate.unobtrusive.js 就可以啦。

利用mvc的HtmlHelper中类似Html.EditorFor(m => m.Name)这样的语法,生成的代码如下:

<input class="text-box single-line" data-val="true" data-val-required="请输入用户名!" id="Name" name="Name" type="text" value="">

这样子,引用的js库就可以解析以data-val-为前缀的属性用来设置验证规则了。data-val="true"表示对用户输入的值进行验证。

如果上面的js库你都引用了,但客户端的验证还是没有起效,那就检查一下配置文件吧。在配置文件中,有两个选项是需要配置为true的,建立mvc应用程序的时候,默认是已经添加了的。

第一行表示启用客户端验证;

第二行表示启用unobtrusive相关的js验证,在使用AjaxHelper,引用jquery.unobtrusive-ajax.js时,也需要该配置为true;

综上所述,客户端的验证需要满足以下几个条件:

①有数据注解

②页面部分使用HtmlHelper生成各种表单元素

③引用相关js文件,如下图:

④配置web.config(默认存在)

三、总结

在实际开发中,基本都是客户端验证+服务器端验证一起使用的;

也有的验证可能还是需要在js中实现,那么在进行后端验证时,就不能只以ModelState.IsValid为参考了,还需要写额外代码验证;如果有错误的时候,可以使用ModelState.AddModelError("key", "errorMesaage");//第一个参数是key,第二个参数是要显示的错误消息

在页面中展示后台的错误消息的时候,有两种方式:

①Html.ValidationSummary(true)

ValidationSummary有几种重载形式:

重载形式

说明

Html.ValidationSummary()

汇总显示所有的验证错误

Html.ValidationSummary(bool)

如果bool参数=true,只显示Model层次的错误,否则所有的验证错误都显示

Html.ValidationSummary(string)

在所有错误消息之前再显示string给出的字符串

Html.ValidationSummary(bool, string)

同Html.ValidationSummary(bool),只是在错误消息前多显示string给出的字符串

在页面数据提交到后台时,表明属性的数据注解验证已经通过了,因此前端显示错误消息的时候只会显示 ModelState.AddModelError()方法中的错误消息;

在页面中会生成如下图所示的div:

ValidationSummary方法会展示所有的错误消息,而不会根据key值显示特定的消息;主要用来汇总显示从后台返回的错误消息列表。

②Html.ValidationMessage(key)

该方法会根据ModelState.AddModelError("key", "errorMesaage")里的key值显示对应的错误消息;

它在前端生成的是一个span标签;

不过通常不会使用该方法,而是使用Html.ValidationMessageFor(c => c.Name)显示属性的数据注解的错误消息;

mvc中服务器端、客户端属性验证的更多相关文章

  1. mvc中常见的属性验证

    客户端验证逻辑会对用户向表单输入的数据给出一个即时反馈.而之所以需要服务器端验证,是因为来自网络的信息都是不能被信任的. 当在ASP.NET MVC设计模式上下文中谈论验证时,主要关注的是验证模型的值 ...

  2. MVC中获取模型属性的Range和StringLength验证特性设置

    MVC中的客户端及服务端模型验证信息都以ModelMetadata类型作为承载,在获得属性的ModelMetadata之后(还不知道怎么获取ModelMetadata的童鞋请自行恶补),我们可以轻松得 ...

  3. mvc中使用remote属性来做ajax验证

    mvc中使用remote属性来做ajax验证比較easy : [Remote("Action", "Controller", AdditionalFields ...

  4. MVC系列学习(十一)-客户端的验证

    1.通过一个实例,来了解MVC中强大的验证功能 1.1新建一个 [基本] 的mvc项目,因为要用到验证的js,然后在一个视图中写上一下代码,以及Model中的代码如下 [注]在调用html.EditF ...

  5. 关于MVC中模型model的验证问题

    今天在做项目练习的时候发现,MVC中使用自带的模型验证时会提前显示在界面上,比如下面所示: 这是什么原因了,是因为我在表示get请求的action里面返回了其界面所显示使用的model,我们知道mvc ...

  6. MVC中”从客户端检测到有潜在危险的Request.Form值“的解决方法

    从客户端检测到有潜在危险的Request.Form值: 在webForm中,可以在aspx页面顶部 <%@ Page Language="C#" AutoEventWireu ...

  7. 在ASP.NET MVC中对手机号码的验证

    在ASP.NET MVC中,可以使用RegularExpression特性来验证手机号码. public class Customer { [Required(ErrorMessage = " ...

  8. 【Azure API 管理】在APIM中使用客户端证书验证API的请求,但是一直提示错误"No client certificate received."

    API 管理 (APIM) 是一种为现有后端服务创建一致且现代化的 API 网关的方法. 问题描述 在设置了APIM客户端证书,用户保护后端API,让请求更安全. 但是,最近发现使用客户端证书的API ...

  9. Asp .Net MVC中常用过滤属性类

    /// <summary> /// /// </summary> public class AjaxOnlyAttribute : ActionFilterAttribute ...

随机推荐

  1. EntityFramework 如何查看执行的 SQL 代码?

    在 VS 调试的时候,如果我们项目中使用的是 EntityFramework,查看 SQL 执行代码就不像 ADO.NET 那样直观了,我们需要设置下,可以参考下: How can I log the ...

  2. 程序员眼中的 SQL Server-非聚集索引能给我们带来什么?

    写在前面 最近在做的一个项目,页面访问的时候很慢(大概几秒钟的样子),然后用日志记录的方式,来排查这个问题,最后发现是 Entity Framework 初始化的一个坑(大概要花 6-7 秒),详见: ...

  3. spring boot源码分析之SpringApplication

    spring boot提供了sample程序,学习spring boot之前先跑一个最简单的示例: /* * Copyright 2012-2016 the original author or au ...

  4. C# 保护Excel文档

    C# 保护Excel文档 说到保护excel文档,我们首先想到的是密码保护的方式,但excel与word有点不一样,一般情况下,每个excel工作薄都或多或少地含有一定数量的工作表,因此保护excel ...

  5. 浅谈 php 采用curl 函数库获取网页 cookie 和 带着cookie去访问 网页的方法!!!!

    由于近段时间帮朋友开发一个能够查询正方教务系统的微信公众平台号.有所收获.这里总结下个人经验. 开讲前,先吐槽一下新浪云服务器,一个程序里的   同一个函数  在PC测试可以正常运行,在它那里就会挂的 ...

  6. selenium操作隐藏的元素

    有时候我们会碰到一些元素不可见,这个时候selenium就无法对这些元素进行操作了.例如,下面的情况: Python 页面主要通过“display:none”来控制整个下拉框不可见.这个时候如果直接操 ...

  7. Android 学习Activity(1)activity和intent

    工具是:JDK环境配置+SDK+ADT工具 一.Activity  主要作用: 1.用户与应用程序的接口 2.控件的容器 二.创建Activity要点:(在src中的目录下包里) 1.一个Activi ...

  8. 弹幕文化与HTML5

    分享人:herry 弹幕篇:弹幕文化与HTML5 说说弹幕 弹幕文化 1什么是弹幕? 弹(dàn)幕(mù)在国内兴起已经有个把年了,相信很多朋友都差不多知道弹幕这个东西. 弹幕系统最初的起源是一家日 ...

  9. 如何通过cmd开一个本地服务器

    1.首先你要下载安装node.js http://nodejs.cn/download/ 并且根据提示安装在自己的电脑上即可 2.打开cmd管理员窗口输入npm -v 检测node.js是否安装成功: ...

  10. 转: GUI应用程序架构的十年变迁:MVC,MVP,MVVM,Unidirectional,Clean

    十年前,Martin Fowler撰写了 GUI Architectures 一文,至今被奉为经典.本文所谈的所谓架构二字,核心即是对于对于富客户端的 代码组织/职责划分 .纵览这十年内的架构模式变迁 ...