Adding Validation to the Model ,在Model中添加数据验证

参考:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-validation-to-the-model

本文内容:

这一节我们在Movie Model中添加逻辑验证(validation logic),从而确保我们在页面中新增和编辑的时候录入的数据是正确的合法的。

ASP.NET MVC一个核心的代码设计原则(code design tenets)是DRY(Don’t Repeat Yourself).ASP.NET鼓励你同样功能的方法或者行为只需要指定一次,然后在项目中所有需要的地方很容易的体现出来。这样减少了你写代码的总量,并且让你的代码更不容易出错,并且更好控制。

ASP.NET MVC和Entity Framework Code First提供的这种验证(validation)就是DRY原则的一个很好的例子。你只需要在一个地方(model class)声明验证规则(validation),这个规则就会在项目中的每一个调用model class的地方(insert,edit)进行验证。

我们现在来看一下,在movie applicaton中添加validation的好处
一、Add Validation Rules to the Movie Model 在Movie Model中添加一些逻辑验证规则
Movie.cs中添加命名空间:using System.ComponentModel.DataAnnotations;

这个命名空间提供了一组内置(build-in)的验证属性,这些验证属性可以声明在Model类中的字段属性前面,对字段属性进行验证。
现在我们用这些内置的Validation Rule [Required],[StringLength],[Range]更新Model Class

  , )]
        )]
        public string Rating { get; set; }
    }

Ctrl+F5运行程式:

这是因为我们更新了Movie Class,Code First检查到movie和datebase中不一致,所以抛出了错误,现在我们用Migrations功能来更新database中的table.

更新前database中table的定义:


执行migrations功能更新db:

PM>add-migration AddDataAnnotationsMig
PM>update-database

刷新资料库后我们看到Table的定义和movie class进行了同步:


Migrations完成以后,Migrations文件夹下面添加了新了迁移类文件:

这些validation attributes 对model class中字段进行约束。Required代表字段必须有值,Range 代表字段值需要在特定的范围之内,StringLength代表字段值的最大长度,默认情况下是任意长度。其他的一些validations attribute例如:decimal,int,float,DateTime默认不能为空的,所以前面不用再加[Required]

不在(1-100)之间。

  public ActionResult Index()
        {
            MovieDBContext db = new MovieDBContext();

Movie movie = new Movie();
            movie.Title = "Gone with the Wind";
            movie.Price = 0.0M;

db.Movies.Add(movie);
            db.SaveChanges();        // <= Will throw server side validation exception

return View(db.Movies.ToList());
        }

调试弹出错误:

这种由.NET Framework自动执行的验证机制(validation rules)可以让你的代码更加强健。也会确保你忘记对数据进行验证或者是不小心疏忽把错误的数据录入database.

二、     页面上的验证提示Validation Error UI in ASP.NET MVC
我们添加一个新的movie:

我们填写的数据不符合规则,当鼠标移开文本框的时候,页面就提示我们输入的数据不合法,这样的机制在客户端和服务器端都保证了数据符合规则。这样最大的好处就是,你不用再像ASP.NET那样在后台或者前台添加单独的代码对所有录入的数据一一进行判断是否符合规则。Controller和Views自动就会调用model class 中指定的validations rules来检查数据。

我们再来看一下Title和Genre ,这两个字段,movie class中对这两个字段只添加了[Require]的validation attribute,我们没有输入的时候也没有红色提示说必须输入。但是一旦我们提交按钮,或者输入文字后鼠标焦点移开文本框就会有提示说是必填字段。

当页面中所有的数据都是正确的时候,页面数据才会提交到server端

三、     验证是如何在View中和 Action方法中实现的

我们会想,我们只是在movie class中添加了[Require]之类的validation attribute。并没有在view和action方法中添加验证,那么view和action方法是如果实现对数据的验证的呢?
我们先看一下Action Method中的post请求的create方法。方法中调用了ModelState.IsValid来验证页面提交过来的movie model是否合法,如果不合法,Create方法就会再次返回到form里面去,如果数据正确,Create方法就会把新的数据保存到数据库

  [HttpPost]
        public ActionResult Create(Movie movie)
        {
            if (ModelState.IsValid)
            {
                db.Movies.Add(movie);
                db.SaveChanges();
                return RedirectToAction("Index");
            }

return View(movie);
        }

由于我们页面段有JavaScript验证,如果数据不合法页面就直接提示错误,就不会把数据通过POST方法提交的服务器。现在我们禁用页面的JavaScript检查,来看一下Action Method具体是如何对数据进行验证的。

,禁用浏览器的JavaScript,页面就不会提示数据错误了

2,在ActionResult Create中下断点,调试我们看到,前台页面不会报错:

但是ModelState.IsValid==false

页面直接return view,页面提示数据错误:

我们再来看一下View中时如果对这些数据进行检查的:


Html.EditorFor 相当于HTML中的<input>文本框,代表movie中的属性

Html.ValidationMessageFor 对<input>中的数据进行检查

这两个Html Helper方法从Controller中接收数据,并自动查询Model中的验证属性,并提示错误的信息。

这样的验证机制,View和Controller中根本不知道数据验证规则(validation rule),这个规则只需要写在Model Class中,这些验证就自动套用到其他需要的views template中,例如create template and edit tempalte.

如果你想更改valudation rule ,你只需要在model class中进行更改, view和controller中默认就会执行这个验证。这就是DRY原则

四、     在Movie Model中添加格式验证Adding Formatting to the Movie Model
System.ComponentModel.DataAnnotations;同样提供了一组内置的格式属性,在view template中显示 Model中的数据对应的格式,如时间格式.

DataType Attribute 并不会对数据格式进行验证,他们只是告诉View页面改如何显示数据,例如DataType.Date  attribute显示不带小时的日期类似的DataType Attribute还有:URL,PhoneNumber等. RegularExpression attribuate 被用来对数据的格式进行验证

我们同样可以用一组DataFormatString来指定数据应该以怎样的格式呈现。

补充:如果我们更新Model中的Validation Attribuate例如,把Rating的字段长度改为8,[StringLength(8)]运行的时候会提示“由於建立了資料庫,支援 'MovieDBContext' 內容的模型已經變更”的错误。我们更新Configuration的AutomaticMigrationsEnabled为True


PM>update-database


Ctrl+Shift+B重建,Ctrl+F5执行.

下一节我们会再详细看一下Detail Template 和 Delete Template

See You …

ASP.NET MVC 学习7、为Model Class的字段添加验证属性(validation attribuate)的更多相关文章

  1. ASP.NET MVC 学习5、登陆页面改为SSO验证

    单点登录(SSO,single sign-on)是一个会话或用户身份验证过程,用户只需要登录一次就可以访问所有相互信任的应用系统,二次登录时无需重新输入用户名和密码.简化账号登录过程并保护账号和密码安 ...

  2. ASP.NET MVC学习之Ajax(完结)

    一.前言 通过上面的一番学习,大家一定收获不少.但是总归会有一个结束的时候,但是这个结束也意味着新的开始. 如果你是从事ASP.NET开发,并且也使用了第三方控件,那么一定会觉得ASP.NET开发aj ...

  3. ASP.NET MVC学习之控制器篇

    一.前言 许久之后终于可以继续我的ASP.NET MVC连载了,之前我们全面的讲述了路由相关的知识,下面我们将开始控制器和动作的讲解. ASP.NET MVC学习之路由篇幅(1) ASP.NET MV ...

  4. Asp.Net MVC学习总结之过滤器详解(转载)

    来源:http://www.php.cn/csharp-article-359736.html   一.过滤器简介 1.1.理解什么是过滤器 1.过滤器(Filters)就是向请求处理管道中注入额外的 ...

  5. ASP.NET MVC 学习笔记-2.Razor语法 ASP.NET MVC 学习笔记-1.ASP.NET MVC 基础 反射的具体应用 策略模式的具体应用 责任链模式的具体应用 ServiceStack.Redis订阅发布服务的调用 C#读取XML文件的基类实现

    ASP.NET MVC 学习笔记-2.Razor语法   1.         表达式 表达式必须跟在“@”符号之后, 2.         代码块 代码块必须位于“@{}”中,并且每行代码必须以“: ...

  6. ASP.NET MVC 学习笔记-7.自定义配置信息 ASP.NET MVC 学习笔记-6.异步控制器 ASP.NET MVC 学习笔记-5.Controller与View的数据传递 ASP.NET MVC 学习笔记-4.ASP.NET MVC中Ajax的应用 ASP.NET MVC 学习笔记-3.面向对象设计原则

    ASP.NET MVC 学习笔记-7.自定义配置信息   ASP.NET程序中的web.config文件中,在appSettings这个配置节中能够保存一些配置,比如, 1 <appSettin ...

  7. ASP.NET MVC学习之视图篇(2)

    继ASP.NET MVC学习之视图(1)学习 4.HTML辅助器 虽然在ASP.NET MVC中我们已经摆脱了ASP.NET的控件,但是对于页面中需要循环标签的情况依然还是存在,可能很多人认为用for ...

  8. ASP.NET MVC学习之过滤器篇(2)

    下面我们继续之前的ASP.NET MVC学习之过滤器篇(1)进行学习. 3.动作过滤器 顾名思义,这个过滤器就是在动作方法调用前与调用后响应的.我们可以在调用前更改实际调用的动作,也可以在动作调用完成 ...

  9. ASP.NET MVC学习之过滤器篇(1)

    一.前言 继前面四篇ASP.NET MVC的随笔,我们继续向下学习.上一节我们学习了关于控制器的使用,本节我们将要学习如何使用过滤器控制用户访问页面. 二.正文 以下的示例建立在ASP.NET MVC ...

随机推荐

  1. android 开发:讯飞的离线命令识别器官方demo使用及demo下载

    场景:使用本地构建语法,离线识别命令词. 修改文件AsrDemo.java mLocalGrammar  修改为你自己的语法 mAsr.setParameter(SpeechConstant.GRAM ...

  2. 3563: DZY Loves Chinese - BZOJ

    Description神校XJ之学霸兮,Dzy皇考曰JC.摄提贞于孟陬兮,惟庚寅Dzy以降.纷Dzy既有此内美兮,又重之以修能.遂降临于OI界,欲以神力而凌♂辱众生. 今Dzy有一魞歄图,其上有N座祭 ...

  3. SQL Server性能常用语句

    查看各表的数据行数 SELECT o.name, i. ROWS FROM sysobjects o, sysindexes i WHERE o.id = i.id AND o.Xtype = ORD ...

  4. HTML/CSS中常遇到的bug 一些注意事项总结

    1.IE6下横向双倍margin bug (触发条件:块属性标签:float:横向margin设置:IE6下.解决办法:css中加入display:inline.) 2.css中公用属性首先声明:如对 ...

  5. [设计模式] 22 模板方法模式 template

    转http://www.jellythink.com/archives/407 在GOF的<设计模式:可复用面向对象软件的基础>一书中对模板方法模式是这样说的:定义一个操作中的算法骨架,而 ...

  6. 设置Eclipse智能提示

    原地址:http://blog.csdn.net/sz_bdqn/article/details/4956162 今天有点时间,研究了一下MyEclispse的智能感知的功能.刚开始使用它时总是感觉如 ...

  7. poj 2031 Building a Space Station(最小生成树,三维,基础)

    只是坐标变成三维得了,而且要减去两边的半径而已 题目 //最小生成树,只是变成三维的了 #define _CRT_SECURE_NO_WARNINGS #include<stdlib.h> ...

  8. POJ 3321 Apple Tree(后根遍历将树转化成序列,用树状数组维护)

    题意:一棵树,有很多分叉,每个分叉上最多有1个苹果. 给出n,接下来n-1行,每行u,v,表示分叉u,v之间有树枝相连.这里数据中u相当于树中的父节点,v相当于子节点. 给出两个操作: 1.C x  ...

  9. 拼写sql语句随笔

    DECLARE @str NVARCHAR(1000)='SELECT * FROM dbo.V_MicroUserInfo ',@where VARCHAR(1000)=' where 1=1' D ...

  10. POJ 3440 Coin Toss(求概率)

    题目链接 题意 :把硬币往棋盘上扔,分别求出硬币占1,2,3,4个格子的时候的概率. 思路 : 求出公式输出,不过要注意输出格式,我还因为输入的时候用了int类型错了好几次..... #include ...