http://www.studyofnet.com/news/339.html

http://www.cnblogs.com/kissdodog/archive/2013/05/04/3060278.html

本文导读:ASP.NET MVC3中的Model是自验证的,这是通过.NET4的System.ComponentModel.DataAnnotations命名空间完成的。 我们要做的只是给Model类的各属性加上对应的验证标记(Attributes)就可以让MVC3框架帮我们完成验证。下面介绍MVC中数据验证的相关知识

一、客户端验证

客户端验证主要是为了提高用户体验,在网页不回刷的情况下完成验证。

1、第一步是要在web.config里启用客户端验证,这在MVC3自带的模板项目中已经有了

<add key="ClientValidationEnabled" value="true"/>

<add key="UnobtrusiveJavaScriptEnabled" value="true"/>

2、然后在被验证的View页面上要加入这样两个JavaScript,注意,他们是依赖于JQuery的

<script src="@Url.Content("~/Scripts/jquery.validate.min。js")" type="text/javascript"></script>

<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min。js")" type="text/javascript"></script>

3、验证消息的显示有两种,一种是ValidationSummary,它可以显示一份验证消息的汇总,包括从后台Action里返回的消息

 @Html.ValidationSummary(true, "Login was unsuccessful. Please correct the errors and try again.")
 

另一种是Model中各属性对应HTML控件的验证消息

 @Html.ValidationMessageFor(m => m.UserName)
 
 
 
 
二、Model中加入 验证标记 进行验证
 
 
1、基础特性
 

(1)、Required
 
必填选项,当提交的表单缺少该值就引发验证错误。

(2)、StringLength
 
指定允许的长度
 
指定最大长度:
 
[StringLength(20)]  //最大长度不超过20个字符

指定最短于最长限制:
 
 [StringLength(20,MinimumLength=3)]  //最大长度不超过20个字符,最短不能低于3个字符

(3)、RegularExpression
 
正则表达式能够匹配的字符串,如果不能匹配,则报一个验证错误
 
[RegularExpression(@"[A-Za-z0-9.%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}")]

  

(4)、Range
 

Range特性用来指定数值类型值的最小值和最大值。
 
[Range(35,44)]    //整型,最小35,最大44
[Range(typeof(decimal),"0.00","49.99")]    //decimal类型

 

(5)、Remote
 
允许利用服务器端的回调函数执行客户端的验证逻辑。说白了就是支持AJAX验证。
 
这个写个异步验证用户名是否存在的DEMO:

 
C# 代码   复制

        [Required]

        [Remote("CheckUserName", "Home")]

        public string UserName

        {
get;
set;
}

Controller代码

 
C# 代码   复制

        public JsonResult CheckUserName(string UserName)

        {
bool result = true;
if (UserName == "admin")
{
result = false;
}
return Json(result,JsonRequestBehavior.AllowGet);
}

显示结果

(6)、Compare

用于确保模板对象的两个对象拥有相同的值。
 
例如,通常输入密码之后还要求用户再次确认密码,这时候就是Compare属性发挥作用的时候了。
 
[Compare("要对比的属性名")]

2、自定义错误提示消息

每个特性都允许传递一个带有自定义错误提示消息的参数。

 
C# 代码   复制

        [Required(ErrorMessage="用户名必须填写")]

        [Remote("CheckUserName", "Home",ErrorMessage="此用户名已存在")]

        public string UserName

        {
get;
set;
}

自定义错误消息,还有一个格式项,如

C# 代码   复制

[Required(ErrorMessage="{0}必须填写")]

publit string Name

{
get;
set;
}

则{0}在输入的时候会被Name替换
 
如果以上的验证方式还不够,你还可以自定义验证

3、显示和编辑注解

(1)、Display
 
如果使用的是直接EditorForModel实现的话,Display特性可以帮助你设置友好的显示名称
 
例如:
 
[Display(Name="密码")]
public string PassWord { get; set; }

(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中设置的初始值:

 
C# 代码   复制

        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" />

 三、验证示例

1、首先新建一个MVC项目。添加如下代码,代码非常简单:一个Person_Model类

 
C# 代码   复制

    public class Person_Model

    {
[Required]
public int Id { get; set; }

[Required]
public string Name { get; set; }

[Required]
public int Age { get; set; }
}

2、Controller类代码

C# 代码   复制

    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();
}
}

3、视图代码

 
C# 代码   复制

@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>

4、执行的效果

MVC中数据验证的更多相关文章

  1. MVC 3 数据验证 Model Validation 详解

    在MVC 3中 数据验证,已经应用的非常普遍,我们在web form时代需要在View端通过js来验证每个需要验证的控件值,并且这种验证的可用性很低.但是来到了MVC 新时代,我们可以通过MVC提供的 ...

  2. (转)MVC 3 数据验证 Model Validation 详解

    继续我们前面所说的知识点进行下一个知识点的分析,这一次我们来说明一下数据验证.其实这是个很容易理解并掌握的地方,但是这会浪费大家狠多的时间,所以我来总结整理一下,节约一下大家宝贵的时间. 在MVC 3 ...

  3. <转>ASP.NET学习笔记之MVC 3 数据验证 Model Validation 详解

    MVC 3 数据验证 Model Validation 详解  再附加一些比较好的验证详解:(以下均为引用) 1.asp.net mvc3 的数据验证(一) - zhangkai2237 - 博客园 ...

  4. 期货大赛项目|四,MVC的数据验证

    上图先看下效果 样式先不说,先了解下数据验证是怎么实现的 一 必须是强类型的视图 二 这些显示提示的话语,都在强类型的实体中 三 必须使用Html.BeginForm或者Html.AjaxBeginF ...

  5. MVC 多种 数据验证 post

    技术:c# .net  采用mvc框架,实现model的数据验证. 刚开始觉得数据验证很方便,可以判断非空.数据正确性,但是后来发现很多需要数据库的判定还是需要post请求做,但是就想mvc的数据验证 ...

  6. 二、Ajax请求MVC中数据查询表返回datatable

    一.Ajax请求MVC中数据查询表返回datatable 解决方式 返回list

  7. MVVM中数据验证之 ViewModel vs. Model

                                                      MMVM模式示意图. View绑定到ViewModel,然后执行一些命令在向它请求一个动作.而反过来 ...

  8. MVC Model数据验证

    概述 上节我们学习了Model的数据在界面之间的传递,但是很多时候,我们在数据传递的时候为了确保数据的有效性,不得不给Model的相关属性做基本的数据验证. 本节我们就学习如何使用 System.Co ...

  9. ASP.NET MVC 扩展数据验证 转

    此文只作记录 public class MaxWordsAttribute : ValidationAttribute { public MaxWordsAttribute(int maxWords) ...

随机推荐

  1. 学习笔记 | Github

    Github教程 \(Github\)是个好东西QwQ 存代码不用U盘爸爸妈妈再也不用担心我的U盘弄丢没有备份啦! 创建github账号 创建仓库 输入命令 git clone https://git ...

  2. Python处理PDF和Word文档常用的方法

    Python处理PDF和Word文档的模块是PyPDF2,使用之前需要先导入. 打开一个PDF文档的操作顺序是:用open()函数打开文件并用一个变量来接收,然后把变量给传递给PdfFileReade ...

  3. Linux(Contos7.5)环境搭建之JDK1.8安装(二)

    1.下载安装包 wget -p 目录 url包地址 2.解压安装包 tar -xzvf  文件 -C 指定目录 3.修改名称 mv jdk1.8.0_45 jdk1.8 4.配置环境变量 vim /e ...

  4. Java将json字符串转成map

    Map<String, Object> map = (Map<String, Object>) JSONUtils.parse(result)

  5. beat冲刺(6/7)

    目录 摘要 团队部分 个人部分 摘要 队名:小白吃 组长博客:hjj 作业博客:beta冲刺(6/7) 团队部分 后敬甲(组长) 过去两天完成了哪些任务 ppt制作 视频拍摄 接下来的计划 准备答辩 ...

  6. Keil C51与Keil ARM共存

    转自:http://blog.chinaunix.net/uid-20734916-id-3988537.html Keil和MDK共存,按照以下步骤:1 先安装 Keil C51,安装目录改为:&q ...

  7. Promise 记录

  8. c++浅拷贝与深拷贝(LeetCode669)

    之前上C++/C#课上老师讲过这个问题,只不过当时主要是跟着老师的节奏与情形,从理论上基本了解了其原理.不过当自己写代码的时候,还是遇到了这个非常坑的问题.因此再来分析一下. 今天第一次做LeetCo ...

  9. 利用ceye中的dns来获取数据

    安恒杯的一道命令执行题目 查看,存在robots.txt文件 查看index.txt文件,存在where_is_flag.php文件 使用cat没有任何回显 可以使用ceye平台利用dns记录内容,网 ...

  10. (二)Jmeter各部件的作用

    JMeter主要组件介绍 1.测试计划(Test Plan)是使用 JMeter 进行测试的起点,它是其它 JMeter 测试元件的容器. 2.线程组(Thread Group)代表一定数量的并发用户 ...