转:MVC 数据验证
一、基础特性
一、Required
必填选项,当提交的表单缺少该值就引发验证错误。
二、StringLength
指定允许的长度
指定最大长度:
[StringLength()] //最大长度不超过20个字符
指定最短于最长限制:
[StringLength(,MinimumLength=)] //最大长度不超过20个字符,最短不能低于3个字符
三、RegularExpression
正则表达式能够匹配的字符串,如果不能匹配,则报一个验证错误
[RegularExpression(@"[A-Za-z0-9.%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}")]
如邮箱格式验证:
[RegularExpression(@"^\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,3}$", ErrorMessage = "请输入正确的电子邮箱地址!")]
四、Range
Range特性用来指定数值类型值的最小值和最大值。
[Range(,)] //整型,最小35,最大44
[Range(typeof(decimal),"0.00","49.99")] //decimal类型
五、Remote
允许利用服务器端的回调函数执行客户端的验证逻辑。说白了就是支持AJAX验证。
需要引用命名空间:System.Web.Mvc;
这个写个异步验证用户名是否存在的DEMO:
[Required]
[Remote("CheckUserName", "Home")]
public string UserName
{
get;
set;
}
Controller代码:
public JsonResult CheckUserName(string UserName)
{
bool result = true;
if (UserName == "admin")
{
result = false;
}
return Json(result,JsonRequestBehavior.AllowGet);
}
显示结果:


留意到,是通过AJAX发送UserName的值到服务器端判断过的。
六、Compare
用于确保模板对象的两个对象拥有相同的值。
例如,通常输入密码之后还要求用户再次确认密码,这时候就是Compare属性发挥作用的时候了。
[Compare("要对比的属性名")]

以上特性需要 using System.ComponentModel.DataAnnotations;
同时需要注意Web.config里面的这两个选项是否设置为了true;
<add key="ClientValidationEnabled" value="true"/>
<add key="UnobtrusiveJavaScriptEnabled" value="true"/>
二、自定义错误提示消息
每个特性都允许传递一个带有自定义错误提示消息的参数。
[Required(ErrorMessage="用户名必须填写")]
[Remote("CheckUserName", "Home",ErrorMessage="此用户名已存在")]
public string UserName
{
get;
set;
}

自定义错误消息,还有一个格式项,如
[Required(ErrorMessage="{0}必须填写")]
publit string Name
{
get;
set;
}
则{0}在输入的时候会被Name替换。
如果以上的验证方式还不够,你还可以自定义验证,到时候忘记了可以翻《Asp.net MVC3 高级编程》第127页。这里就不写DEMO了,用到再写。
三、显示和编辑注解
1、Display
如果使用的是直接EditorForModel实现的话,Display特性可以帮助你设置友好的显示名称
例如:
[Display(Name="密码")]
public string PassWord { get; set; }
显示结果如下:

其次Display还支持显示属性的顺序,如
[Display(Name="密码",order = )]
public string PassWord { get; set; } [Display(Name="密码",order = )]
public string UserName { get; set; }
后面的顺序是显示编辑框的顺序,默认是10000,按升值排序。
2、ScaffoldColumn
隐藏Html辅助方法(如EditorForModel,DisplayForModel)显示一些属性。
[ScaffoldColumn(false)] //不显示该属性的编辑框
public string UserName { get; set; }
虽然ScaffoldColumn可以做到不显示一些属性在页面上被编辑,但是如果提交的Form有这个属性值,模型绑定机制依然会绑定此属性值。要解除就要显式的[Bind]了,这个与本篇无关。此处不提。
3、DisplayFormat
DisplayFormat特性可以用来处理属性的各种格式化选项。当属性包含空值时,可以提供可选的显示文本,也可以为包含标记的属性关闭HTML编码,还可以为运行时指定一个应用于属性值的格式化字符串。
例如:
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:c}")]
public decimal money { get; set; }
这样,当有初始值的时候,显示的代码将如下所示:

注意是初始值,如果是直接填写的并不会有符号。来看Controller中设置的初始值:
public ActionResult PersonAdd()
{
Person_Model p = new Person_Model();
p.money = 12.10M;
return View(p);
}
此显示样式在提交回Controller中是没用的,因为模型绑定器将不能解析返回的价格值。怎么用自己斟酌,用于显示还是OK的。
4、ReadOnly
如果确保默认的模型绑定器不使用请求中的新值更新属性,可以给属性添加ReadOnly特性:
[ReadOnly(true)]
public string Name { get; set; }
注意,此属性仍然会显示一个可编辑的文本框来显示Name,但是模型绑定器不会接收其值,因此只有模型绑定器考虑ReadOnly属性。
5、DataType
DataType特性可以为运行时提供关于属性的特定用途的信息。
例如:
[DataType(DataType.Password)]
public string PassWord { get; set; }
显示效果如下:

该属性可以用于指定多选按钮,单选按钮,密码输入框,等等类型的数据。
6、UIHint
UIHint特性给Asp.net MVC运行时提供了一个模板名字,以备调用模板辅助方法如(DisplayFor和EditorFor)渲染输出时使用。也可以自定义自己的模板辅助方法来重写Asp.net MVC的默认行为。
7、HiddenInput
HiddentInput在名称空间System.Web.Mvc中,它可以告知运行时渲染一个type特性值为"hidden"的输入元素。说白了就是<input type="hidden" value="xxx" />
四、验证示例
首先新建一个MVC项目。添加如下代码,代码非常简单:一个Person_Model类
public class Person_Model
{
[Required]
public int Id { get; set; } [Required]
public string Name { get; set; } [Required]
public int Age { get; set; }
}
Controller类代码:
public class HomeController : Controller
{
public ActionResult PersonAdd()
{
return View();
} [HttpPost]
public ActionResult PersonAdd(Person_Model model)
{
//一行代码判断验证是否通过
if (ModelState.IsValid)
{
return Redirect("/Home/PersonManager");
}
return View();
}
}
视图代码:
@model MvcApplication1.Models.Person_Model
@{
ViewBag.Title = "Index";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<form action="/Home/PersonAdd" method="post">
Id:<input type="text" name="Id" value="" />
@Html.ValidationMessageFor(Model => Model.Id) //之所以写在Person_Model的验证会显示到前端提示,主要是这种代码起的作用
<br />
姓名:<input type="text" name="Name" value="" />
@Html.ValidationMessageFor(Model => Model.Name)
<br />
年龄:<input type="text" name="Age" value="" />
@Html.ValidationMessageFor(Model => Model.Age)
<input type="submit" value="确定" />
</form>
先看执行的效果:

这个例子就是验证的,注意此处没有客户端验证,完全是服务器端验证的,如果出错,视图会渲染再次显示,非常好用啊,很方便啊,要在以前你要写多少行代码来搞定这些繁琐无味的验证呢?微软太体恤程序员了,顶一个。
在前面的例子当中,当数据发送到服务器验证不通过之后,则所有用户填写的内容在重新打开的页面后都清空了, 如果想不清空,即用户第一次填的内容还存在的话,可以return View(接受到的对象);
五、启用客户端验证
另外。貌似前端不执行验证有点浪费服务器资源,如果我们要前端先验证一次通过后再提交,这样能够减少服务器端验证的次数,不能每次有一些小问题都要服务器端验证后再返回吧!那么如何启用客户端验证呢?强大的微软,再次膜拜中,要启用前端验证。你只需要两步
第一步:引入如下4个文件。
<link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" />
<script src="http://www.cnblogs.com/Scripts/jquery-1.7.2.min.js" type="text/javascript"></script>
<script src="http://www.cnblogs.com/Scripts/jquery.validate.min.js" type="text/javascript"></script>
<script src="http://www.cnblogs.com/Scripts/jquery.validate.unobtrusive.min.js" type="text/javascript"></script>
第二步:在表单头部添加:
@{
Html.EnableClientValidation();
}
OK,这下就非常好了,不会因为一些鸡毛蒜皮都提交表单到服务器了。只有当客户端验证通过了,才提交表单到服务器,当然当有表单提交过来,服务器端还是会验证。
六、更改错误提示样式
关于错误的提示样式,在/Content/Site.css里面,你可以找到要用的样式,更改了就可以了,在验证错误的时候视图是会带一个行内样式的,包括被验证的Html控件和错误提示。
特别提示:如果要前端显示生效,即不发送数据到服务器,前端就进行验证并显示错误提示消息,那么Form的引入一定要用MVC的,如:
@using (Html.BeginForm())
{ }
如果是自己写的<form></from>前端提示是无效的。
转:MVC 数据验证的更多相关文章
- MVC 数据验证
MVC 数据验证 前一篇说了MVC数据验证的例子,这次来详细说说各种各样的验证注解.System.ComponentModel.DataAnnotations 一.基础特性 一.Required 必填 ...
- MVC 数据验证[转]
前一篇说了MVC数据验证的例子,这次来详细说说各种各样的验证注解. 一.基础特性 一.Required 必填选项,当提交的表单缺少该值就引发验证错误. 二.StringLength 指定允许的长度 指 ...
- MVC 数据验证【转】
[转自]http://www.cnblogs.com/dozer/archive/2010/04/12/MVC-DataAnnotations.html 作者Dozer 今天在这里给大家介绍一下MVC ...
- mvc 数据验证金钱格式decimal格式验证
mvc 数据验证金钱格式decimal格式验证 首先看下代码 /// <summary> /// 产品单价 /// </summary> [Display(Name = &qu ...
- MVC数据验证
深入浅出 MVC 数据验证 2.0 [附演示源码] 今天在这里给大家介绍一下MVC的数据验证框架. 在1.0版中,很多朋友提出了怎么使用客户端验证,今天找了一些资料,发现了客户端验证的方法. 1.MV ...
- MVC数据验证使用小结
原文:MVC数据验证使用小结 描述:MVC数据验证使用小结 内容:display,Required,stringLength,Remote,compare,RegularExpression 本人最近 ...
- Hibernate Validation,Spring mvc 数据验证框架注解
1.@NotNull:不能为 Null,但是可以为Empty:用在基本数据类型上. @NotNull(message="{state.notnull.valid}", groups ...
- MVC数据验证原理及自定义ModelValidatorProvider实现无编译修改验证规则和错误信息
Asp.net MVC中的提供非常简单易用的数据验证解决方案. 通过System.ComponentModel.DataAnnotations提供的很多的验证规则(Required, StringLe ...
- 【转】ASP.NET MVC 数据验证及相关内容
原文地址:http://www.jb51.net/article/56713.htm 一.数据验证 数据验证的步骤在模型类中添加与验证相关的特性标记在客户端导入与验证相关的js文件和css文件使用与验 ...
- Spring MVC 数据验证——validate注解方式
1.说明 学习注解方式之前,应该先学习一下编码方式的spring注入.这样便于理解验证框架的工作原理.在出错的时候,也能更好的解决这个问题.所以本次博客教程也是基于编码方式.仅仅是在原来的基础加上注解 ...
随机推荐
- 配置VNC
VNC连接Linux桌面,要想连接Linux远程桌面,按照下面的步骤,非常简单.快速,Linux配置VNC(以RedHat.CentOS.Fedora系列为例). 工具/原料 Linux平台安装VNC ...
- 导入excel数据到数据库
1.上传excel到服务器 jsp页面代码 <form action="actionname" method="post" id="form1& ...
- GitHub团队项目合作流程
已在另一篇博客中写出关于以下问题的解决,点此进入: 同步团队项目到本地时出现冲突怎么办? 项目负责人merge一个Pull Request后发现有错怎么回退? 目录: 零.前期准备 一.创建开发分支 ...
- PHP的命名空间 与类是自动加载
namespace 假设如果不使用namespace,那么每个类在一个项目中的名字就必须是固定的.因为php在new的时候不管是调用autoload还是调用已加载过的类,都存在一个类名对应的文件.所以 ...
- 【Java EE 学习 47】【Hibernate学习第四天】【sesion】【一级缓存】【懒加载】
一.Session概述 1.Session 接口是 Hibernate 向应用程序提供的操纵对数据库的最主要的接口, 它提供了基本的保存, 更新, 删除和加载Java 对象的方法. 2.理解Sessi ...
- java中的final的使用
1.final类不能被继承,因此final类的成员方法没有机会被覆盖,默认都是final的.在设计类时候,如果这个类不需要有子类,类的实现细节不允许改变,并且确信这个类不会再被扩展,那么就设计为fin ...
- Guava学习笔记(2):Preconditions优雅的检验参数
转自:http://www.cnblogs.com/peida/p/Guava_Preconditions.html 在日常开发中,我们经常会对方法的输入参数做一些数据格式上的验证,以便保证方法能够按 ...
- dedecms在首页或列表调取文章内容body的三个方法
有时需要在网站首页或栏目封面上显示几篇文章的内页作为导语或其他什么的,但acrlist标签是不能直接调取body的,这时我们就需要使用以下方法来调取body. 方法一:arcticle 标签 加上ch ...
- Slate中绑定动态数据
https://answers.unrealengine.com/questions/232322/slate-blurred-border-shadow.html
- 安装dede显示dir的解决办法
1.遇见安装页面出现dir 2.你这个肯定是已经安装过了的程序,把install文件夹下的index.html删掉,,你再看看install文件夹下有没有install_lock.txt 和index ...