Asp.net MVC验证那些事(1)-- 介绍和验证规则使用 -----原文地址链接

数据的有效性验证,是程序开发中必不可少的环节。这篇文章,我们将用一个实例来说明如何在MVC中使用Validation来保证无论是新增或者更新数据的时候,都必须符合我们定义的验证规则,否则就会提示错误。

一, DRY原则

DRY是Don’t repeat yourself的缩写,意思是不要写重复的代码。MVC中的Validation设计就是遵循了这个原则。 
比如下面中的Movie类, 当用户在网页上填写Movie信息的时候,并保存的数据库中的时候, 由于Title是我们期望的必填项,所以:

1. 在提交表单的时候,需要检查Title是否填写。如果没有,显示警告信息。
2. 在保存到数据库中的时候,也需要检查Title是否有值.

而这些的验证规则,MVC遵循DRY的设计,都是添加到Model上。也就是我们这里的Movie实体类上。

public class Movie {
public int ID { get; set; }
public string Title { get; set; }
public DateTime ReleaseDate { get; set; }
public string Genre { get; set; }
public decimal Price { get; set; }
public string Rating { get; set; }
}

接下来看看如何在Model上添加验证规则

二,在Movie实体类上添加验证规则

.net提供的验证规则在下面的namespace下, 所以在添加代码之前,先引入下面的命名空间:

using System.ComponentModel.DataAnnotations;

可以注意到,这个命名空间不是以System.Web开头的,这也说明了它并不单单是为Web项目准备的,如何其它类型的项目都可以使用。

我们在Movie类上使用.net提供的Required, StringLength,Range验证特性. 下面就是添加完验证特性后的代码:

using System;
using System.Data.Entity;--DbContext需要引用
using System.ComponentModel.DataAnnotations;
namespace MvcMovie.Models { public class Movie {
public int ID { get; set; } [Required(ErrorMessage="请输入标题")]
[Display(Name="标题")]
public string Title { get; set; }

        [DataType(DataType.Date)]
public DateTime ReleaseDate { get; set; } [Required]//可以与Title的Required比较一下
public string Genre { get; set; } [Range(1, 100)]
[DataType(DataType.Currency)] public decimal Price { get; set; } [StringLength(5)]
public string Rating { get; set; }
} public class MovieDBContext : DbContext {
public DbSet<Movie> Movies { get; set; }
}
}

三, 在View页面中,添加MVC的验证

MVC在View这一层提供了HtmlHelper,它有一些扩展方法,能够自动的为我们生成关于字段的客户端验证代码. 这些验证的代码必须是在Form中。

@Html.ValidationSummary()会输出所有验证错误, 一般放在Form头处。
@Html.ValidationMessageFor()是针对单个输入的验证.

在页面上要引用 @model MvcStudy3.Models.Movie---根据实际情况引用类

下面是Movice Add的完整表单代码。

@using (Html.BeginForm()) {
@Html.AntiForgeryToken()
@Html.ValidationSummary() <fieldset>
<legend>Registration Form</legend>
<ol>
<li>
@Html.LabelFor(m => m.Title)
@Html.EditorFor(m => m.Title)
@Html.ValidationMessageFor(m => m.Title)
</li>
<li>
@Html.LabelFor(m => m.ReleaseDate)
@Html.EditorFor(m => m.ReleaseDate)
@Html.ValidationMessageFor(m => m.ReleaseDate)
</li>
<li>
@Html.LabelFor(m => m.Genre)
@Html.TextBoxFor(m => m.Genre)
@Html.ValidationMessageFor(m => m.Genre)
</li>
<li>
@Html.LabelFor(m => m.Price)
@Html.EditorFor(m => m.Price)
@Html.ValidationMessageFor(m => m.Price)
</li>
<li>
@Html.LabelFor(m => m.Rating)
@Html.EditorFor(m => m.Rating)
@Html.ValidationMessageFor(m => m.Rating)
</li>
</ol>
<input type="submit" value="Register" />
</fieldset>
}

四, 运行效果

运行页面,输入想下面的内容,点击Create按钮,就能够看到下面的错误信息。这里的输入验证以及错误信息的显示,就是我们在View中定义的。验证是通过Js做的,所以并不会刷新页面。

五, 后台验证

只是客户端验证,肯定是不够严谨的,还需要添加上服务端验证,因为很容易绕过客户端的验证,直接把非法的数据提交到后端。
由于使用了DRY原则,所以后端代码代码也能够使用Movie实体类上的定义验证规则, 而且MVC还提供了非常简单的方法来处理。

下面是我们的服务端检查代码

public class MovieController : Controller
{
[HttpGet]
public ActionResult Create()
{
return View();
} [HttpPost]
public ActionResult Create(Movie movie)
{
if (ModelState.IsValid)
{
//Do Save
…………
return RedirectToAction("Index", "Home");
}
return View(movie);
}
}

上面的HttpGet,意思是当使用Get请求访问网页时,响应的服务端方法。
HttpPost, 是当提交表单的时候,用来响应的方法。它接收一个Movie类型的参数, ModelState.IsValid会自动检查这个参数是否合法,如果不合法,就返回到原来表单页面上,显示检查错误信息。

接下来,看看服务端的效果。首先要屏蔽掉客户端检查,方法非常简单,只需要修改一下web.config文件。
把ClientValidationEnabled修改成false. 这样客户段验证就关闭了(实际使用中,推荐开启客户端验证)

<appSettings>
<add key="webpages:Version" value="2.0.0.0" />
<add key="webpages:Enabled" value="false" />
<add key="PreserveLoginUrl" value="true" />
<add key="ClientValidationEnabled" value="false" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
</appSettings>

接着再点击Create按钮,提交表单,页面刷新了。显示的错误信息和上面的完全一样。

要实现验证

需要引用下面4个js,这几个js是mvc4.0自带的
 <script src="../../Scripts/Shared/modernizr-2.5.3.js" type="text/javascript"></script>
    <script src="../../Scripts/Shared/jquery.unobtrusive-ajax.js" type="text/javascript"></script>
    <script src="../../Scripts/Shared/jquery.validate.js" type="text/javascript"></script>
    <script src="../../Scripts/Shared/jquery.validate.unobtrusive.js" type="text/javascript"></script>

Asp.net MVC验证那些事(1)-- 介绍和验证规则使用----[转]--[并修改了部分内容]的更多相关文章

  1. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(19)-用户信息的修改和浏览

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(19)-用户信息的修改和浏览  ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    ...

  2. Asp.net MVC验证哪些事(2)-- 验证规则总结以及使用

    上篇文章Asp.net MVC验证那些事(1)-- 介绍和验证规则使用中,介绍了Asp.net MVC中的验证功能以及如何使用.这里将对MVC中内置的验证规则进行总结. 一,查找所有验证规则 上篇文章 ...

  3. ASP.NET MVC 入门8、ModelState与数据验证

    原帖地址:http://www.cnblogs.com/QLeelulu/archive/2008/10/08/1305962.html ViewData有一个ModelState的属性,这是一个类型 ...

  4. [转]ASP.NET MVC 入门8、ModelState与数据验证

    ViewData有一个ModelState的属性,这是一个类型为ModelStateDictionary的ModelState类型的字典集合.在进行数据验证的时候这个属性是比较有用的.在使用Html. ...

  5. asp.net mvc源码分析-ModelValidatorProviders 客户端的验证

    几年写过asp.net mvc源码分析-ModelValidatorProviders 当时主要是考虑mvc的流程对,客户端的验证也只是简单的提及了一下,现在我们来仔细看一下客户端的验证. 如图所示, ...

  6. ASP.NET MVC 使用Remote特性实现远程属性验证

    RemoteAttribute是asp.net mvc 的一个验证特性,它位于System.Web.Mvc命名空间 下面通过例子来说明 很多系统中都有会员这个功能,会员在前台注册时,用户名不能与现有的 ...

  7. 10、ASP.NET MVC入门到精通——Model(模型)和验证

    本系列目录:ASP.NET MVC4入门到精通系列目录汇总 模型就是处理业务,想要保存.创建.更新.删除的对象. 注解(通过特性实现) DisplayName Required StringLengt ...

  8. ASP.NET MVC控制器里捕获视图的错误验证信息(ErrorMessage)

    ViewModel类: /// <summary> /// 评论用验证视图 /// </summary> public partial class VCreateShopCom ...

  9. ASP.NET MVC学习笔记(二)登陆验证

    书上的验证时在配置文件中直接声明用户名和密码,想改成从数据验证账号和密码,搞了一下午都没高出来,不断的调试,发现 var table = userInfo.Tables.FirstOrDefault( ...

随机推荐

  1. MySQL系列(一)

    一.简介 MySQL是最流行的开放源码SQL数据库管理系统,它是由MySQL AB公司开发.发布并支持的.有以下特点: MySQL是一种数据库管理系统. MySQL是一种关联数据库管理系统. MySQ ...

  2. 二进制安装MySQL及破解密码

    二进制安装MySQL及破解密码 1.确保系统中有依赖的libaio 软件,如果没有: yum -y install libaio 2.解压二进制MySQL软件包 tar xf mysql-5.7.24 ...

  3. 第八章服务器raid及配置实战

      版本 特点 磁盘个数 可用空间 故障磁盘数 应用环境 RAID0 读写速度快,数据容易丢失 两个 全部 一块 测试,临时性 RAID1 读写速度慢,数据可靠 至少两个,可以2的倍数 总容量的一半 ...

  4. falsk-web 表单

    web 表单 回顾 在上一章节中,我们定义了一个简单的模板,使用占位符来虚拟了暂未实现的部分,比如用户以及文章等. 在本章我们将要讲述应用程序的特性之一–表单,我们将会详细讨论如何使用 web 表单. ...

  5. 开始导入第一个第三方库jieba

    在做python的练习题,想看看运行结果. 谁知,有道题,不能识别jieba,原来要导入,因为是第三方库,照着书里面的导入方法,有三种,一种是用pip,在命令行里面安装,使用pip - p 可以查看p ...

  6. 利用github的webhook进行自动部署

    利用github的webhook进行自动部署 github提供了webhook功能,大概意思就是,当你提交了代码,git检测到你进行了push,可以调起你一个你知道的url. 这个功能有什么用了?比如 ...

  7. Java——一文读懂Spring MVC执行流程

    说到Spring MVC执行流程,网上有很多这方面的文章介绍,但是都不太详细,作为一个初学者去读会有许多不理解的地方,今天这篇文章记录一下我学习Spring MVC的心得体会 话不多说,先上图: Sp ...

  8. css的属性选择器

    语法说明: 属性选择器需要将对应属性放入到 方括号中  [ ] ,其中包含属性名,标识符(* $ ~ ^ |) 使用说明: [attribute] 例如  [target] 表示 选择带有 targe ...

  9. C#并发编程之初识并行编程

    写在前面 之前微信公众号里有一位叫sara的朋友建议我写一下Parallel的相关内容,因为手中商城的重构工作量较大,一时之间无法抽出时间.近日,这套系统已有阶段性成果,所以准备写一下Parallel ...

  10. 基本Linux命令(上)

           Linux的难点在于我们需要记忆大量的命令及参数.如有问题请批评指正,在下感激不尽.        Linux的命令都是在shell下使用的,也就是我们常说的终端(Terminal).包 ...