应无所住,而生其心
排名
1
文章
860
粉丝
112
评论
163
net core webapi post传递参数
庸人 : 确实坑哈,我也是下班好了好几次,发现后台传递对象是可以的,但...
百度编辑器自定义模板
庸人 : 我建议换个编辑器,因为现在百度富文本已经停止维护了,用tinymec...
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

ASP.NET MVC 模型验证

8152人阅读 2019/10/4 16:51 总访问:5185646 评论:0 收藏:1 手机
分类: .NET MVC


MVC自带有模型验证,它是通过System.ComponentModel.DataAnnotations命名空间完成。 我们要做的只是给Model类的各属性加上对应的验证特性(Attributes)就可以让MVC框架帮我们完成验证。


我们常规的验证就是喜欢写很多判断

如下:

  1. [HttpPost]
  2. public ActionResult Index(Register reg)
  3. {
  4.     if (String.IsNullOrEmpty(reg.UserName))
  5.     {
  6.         ModelState.AddModelError("UserName""用户名不能为空");
  7.     }
  8.     else if (reg.UserName.Length < 6)
  9.     {
  10.         ModelState.AddModelError("UserName""用户名长度不能小于6位");
  11.     }
  12.     if (ModelState.IsValidField("BirthDate") && reg.BirthDate > DateTime.Now)
  13.     {
  14.         ModelState.AddModelError("BirthDate""生日不能为将来的时间");
  15.     }
  16.     if (ModelState.IsValid)
  17.     {
  18.         //保存数据
  19.     }
  20.     return View();
  21. }

上面这种方式的验证虽然简单,很多人都能够立马上手,但是看到方法中N多个if语句的确不是个滋味,这种重复性的代码完全可以封装好然后通用。


使用特性进行验证:

[Required]:必填

[StringLength(60)]:字符串长度验证,最大60

[StringLength(50, MinimumLength = 6)]:字符串长度验证,最小6最大50

[Range(typeof(Decimal), "0", "100", ErrorMessage = "{0} 必须是数字介于 {1} 和 {2}之间.")]:范围跟上错误提示

[Range(typeof(decimal), "0.00", "49.99")]:小数的范围
[Range(typeof(DateTime), "11/10/2017", "11/10/2021")]:日期范围
[Range(35,44)]:范围

[RegularExpression(@”[A-Za-z0-9._%+-]+")]:正则的验证

[Compare("Password",ErrorMessage="密码要一致")]:进行两个值比较,比如用于密码是否相同

[Remote("CheckUserName", "Register", ErrorMessage = "用户名已被注册")]:远程验证


要验证很简单只需要使用ModelState.IsValid即可,就可以验证控制器接收到的模型

  1. public ActionResult Do(TNBlogResource tnblogResource)
  2. {
  3.     //进行模型验证
  4.     if (ModelState.IsValid)
  5.     {
  6.     }
  7.     return View();
  8. }

有些时候我们想要验证的不是写到方法参数上面的模型,是我们想要验证指定的模型实例

其实也很简单使用TryValidateModel即可

  1. var movie = new Movie
  2. {
  3.     Title = title,
  4.     Genre = genre,
  5.     ReleaseDate = modifiedReleaseDate,
  6.     Description = description,
  7.     Price = price,
  8.     Preorder = preorder,
  9. };
  10. //验证指定的模型实例
  11. TryValidateModel(movie);
  12. if (ModelState.IsValid)
  13. {
  14.     _context.AddMovie(movie);
  15.     _context.SaveChanges();
  16.     return RedirectToAction(actionName: nameof(Index));
  17. }
  18. return View(movie);

你使用了TryValidateModel后如果验证不通过想要看到具体的错误信息可以在调用一下ModelState.IsValid这样在ModelState中就可以看到具体的错误信息了

keys里边放的是出现错误的属性,如下

values里边就是具体的错误信息了


前台验证:

当然mvc里边的模型验证还可以配合前台验证,使用起来也比较简单

1:引入需要的js

前台验证使用的是jquery.validate,所以需要把相关的js引入进来一共需要三个

jquery,jquery.validate,jquery.validate.unobtrusive

  1. <script src="~/Scripts/jquery-3.3.1.js"></script>
  2. <script src="http://static.runoob.com/assets/jquery-validation-1.14.0/dist/jquery.validate.min.js"></script>
  3. <script src="~/content/jquery.validate.unobtrusive.min.js"></script>

其实呢前台只用jquery.validate.js就行,只是jquery.validate.unobtrusive是封装好的更好的配合asp.net mvc中的模型验证使用,可以更方便快捷的输出错误信息。

可以在运行时由服务器端根据Model中设置的验证规则,自动生成客户端验证js代码(结合jquery.validate)。这很好地解决了表单验证时一次代码,两次验证(客户端+服务器端)的问题

jquery.validate.unobtrusive.js下载地址:

https://download.tnblog.net/resource/index/03b887338c5a4c92a8562ad4c8dbab53

注意js的引入顺序,这个js要在前面两个js之后引入


如果只是纯前端的验证,也就是jquery.validate的使用,可以参考:

https://www.tnblog.net/aojiancc/article/details/2643



2:输入框的生成使用TextBoxFor的方式

  1. //申明model
  2. @model EFLearn2.Users
  3. //根据Model生成文本框
  4. @Html.TextBoxFor(a => a.UserName)
  5. @Html.TextBoxFor(a => a.Number)
  6. @Html.TextBoxFor(a => a.UClass)

因为这种方式生成,他会把相关的错误配置,根据后台那个模型配置都生成好,这样就可以很好把后台的模型配置和前台结合起来了

根据生成的input标签的结果,我们可以很好的知道,前台的jquery验证插件的错误配置根据后台模型配置自动生成好了,非常方便,不需要从新在写一次



3:在想要输出错误信息的地方使用@Html.ValidationSummary()

其实它就是帮我们生成了一串html代码用于显示错误信息:

  1. <div class="validation-summary-valid" data-valmsg-summary="true">
  2.    <ul>
  3.        <li style="display:none"></li>
  4.   </ul>
  5. </div>

当然这串代码你完全可以自己写,只是我们用这个html帮助类会更快捷一点


4:然后使用验证插件的valid方法,即可知道有没有通过验证,没有通过验证就会输出错误信息

  1. var exeupdate = function (param{
  2.     //是否验证通过
  3.     if ($("#updateform").valid()) {
  4.       //验证通过后的逻辑
  5.     }
  6. }

效果如下:

显示红色我们给一个样式即可:

  1. .validation-summary-errors {
  2.     color: red;
  3. }

前台的所有代码如下:

  1. <link href="~/media/css/bootstrap.min.css" rel="stylesheet" />
  2. <link href="~/media/css/style.css" rel="stylesheet" />
  3. <script src="~/media/js/jquery-1.10.1.min.js"></script>
  4. <script src="http://static.runoob.com/assets/jquery-validation-1.14.0/dist/jquery.validate.min.js"></script>
  5. <script src="~/content/jquery.validate.unobtrusive.min.js"></script>
  6. <script src="~/content/myjquery.js"></script>
  7. <style>
  8.     .validation-summary-errors {
  9.         color: red;
  10.     }
  11.     .field-validation-error {
  12.         color: red;
  13.     }
  14. </style>
  15. @model EFLearn.Users
  16. <div style="width: 88%; margin: 60px auto" id="updatediv">
  17.     <form id="updateform">
  18.         <div class="row-fluid">
  19.             <div class="span6">
  20.                 <h4>用户</h4>
  21.                 <input type="hidden" id="Id" name="Id" />
  22.                 <p>
  23.                     @Html.TextBoxFor(a => a.UserName, new { @class = "span12 m-wrap" })
  24.                 </p>
  25.                 <h4>学号</h4>
  26.                 <p>
  27.                     @Html.TextBoxFor(a => a.Number, new { @class = "span12 m-wrap" })
  28.                 </p>
  29.             </div>
  30.             <div class="span6">
  31.                 <h4>班级</h4>
  32.                 <p>
  33.                     @Html.TextBoxFor(a => a.UClass, new { @class = "span12 m-wrap" })
  34.                 </p>
  35.                 <h4>状态</h4>
  36.                 <p>
  37.                     <select class="span12 m-wrap" id="CheckType" name="CheckType">
  38.                         <option value="1">审核通过</option>
  39.                         <option value="2">正在审核</option>
  40.                         <option value="3">审核失败</option>
  41.                     </select>
  42.                 </p>
  43.             </div>
  44.         </div>
  45.         @Html.ValidationSummary()
  46.     </form>
  47. </div>
  48. <script>
  49.     var inject = function (obj{
  50.         $("#updateform").injectValue(obj);
  51.     }
  52.     var exeupdate = function (param{
  53.         //是否验证通过
  54.         if ($("#updateform").valid()) {
  55.           //验证通过后的逻辑
  56.         }
  57.     }
  58. </script>

tip:网上有人说验证要生效前台的表单必须要使用@html.form来生成才可以,我这里没有使用也是可以的。只是像@Html.ValidationSummary()这类输出验证的要放到form标签里边才行,这点要注意。


把验证的错误信息放到指定的地方

上面是通过@Html.ValidationSummary()把所有错误信息输入到一个地方

当然也可以使用@Html.ValidationMessageFor来指定具体某个字段的错误信息和输出位置

  1. <div class="span6">
  2.     <h4>用户</h4>
  3.     <input type="hidden" id="Id" name="Id" />
  4.     <p>
  5.         @Html.TextBoxFor(a => a.UserName, new { @class = "span12 m-wrap" })
  6.         @Html.ValidationMessageFor(a => a.UserName)
  7.     </p>
  8.     <h4>学号</h4>
  9.     <p>
  10.         @Html.TextBoxFor(a => a.Number, new { @class = "span12 m-wrap" })
  11.         @Html.ValidationMessageFor(a => a.Number)
  12.     </p>
  13. </div>

如下:用户和学号的错误信息都被显示到输入框的下面了

当然我这个错误信息这样显示样式就会错乱了,只是为了说明一下@Html.ValidationMessageFor可以把错误信息输入到想要的地方去


前台验证是否全部为空格

添加一个方法:

  1. // 全空格验证
  2. $.validator.addMethod("isBlank"function (value, element{
  3.     var blank = /^[ ]*$/;
  4.     return this.optional(element) || !(blank.test(value));
  5. }, "不能全输入空格");

使用的时候在class里边添加上isBlank就好了

  1.   <input id="lovename="loveclass="isBlankrequired />


tip:代码标准和规范也是非常重要的,不会让整个项目越写越乱


参考项目下载地址:https://download.tnblog.net/resource/index/54f28c67148d4ac4b95dbf3d2ea5da9a



当你用心写完每一篇博客之后,你会发现它比你用代码实现功能更有成就感!




欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)

评价

模型验证(简化IF)

模型验证需要在对象部分验证//先引入命名空间 usingSystem.ComponentModel.DataAnnotations; //对象部分 //设置userna...

net core 使用 EF Code First

下面这些内容很老了看这篇:https://www.tnblog.net/aojiancc2/article/details/5365 项目使用多层,把数据库访问...

cAPS.net 保存base64位格式的图片

publicvoidUpload() { //取出图片对应的base64位字符 stringimgBase=Request[&quot;imgBase&quot;]; //c#里边的base6...

Quartz.net实例动态改变周期调度。misfire、Cron

Quartz:Java编写的开源的任务调度作业框架 类似Timer之类定时执行的功能,但是更强大Quartz.NET:是把Quartz转成C# NuGet...

.net Windows服务发布、安装、卸载、监听脚本。服务调试

一、脚本 为方便不用每次都去写安装卸载的脚本1.安装脚本@echooff @echo开始安装【服务】 %SystemRoot%\Microsoft.NET\Fr...

c、VB.net中全角半角转换方法

///&lt;summary&gt; ///转全角的函数(SBCcase) ///&lt;/summary&gt; ///&lt;paramname=&quot;input&quot;&gt;任意字符串...

.net mvc分部页,.net core分部页

.net分部页的三种方式第一种:@Html.Partial(&quot;_分部页&quot;)第二种:@{ Html.RenderPartial(&quot;分部页&quot;);}...

C.net 配合小程序实现经过第三方服务器中转文件

某些时候,微信小程序前段上传文件的时候需要经过第三方服务器再将文件上传到客户的服务器;操作如下:1:(小程序内向中端服...

.net实现QQ邮箱发送邮件功能

1、微软已经帮我们封装好了发送邮件的类MailMessage,MailMessage类构造一些邮件信息,然后通过SmtpClient进行邮件发送。Mai...

StackExchange.Redis操作redis(net core支持)

官方git开源地址https://github.com/StackExchange/StackExchange.Redis官方文档在docs里边都是官方的文档通过nuget命令下...

windows 自带的netsh进行端口映射

使用netsh 把本地任意ip的25566端口 映射到192.168.81.234的25565端口netshinterfaceportproxyaddv4tov4listenaddress=0.0....

确保.net程序始终以管理员身份运行

usingSystem; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Text; usingSystem.Threading.Tasks; ...

ASP.net Timer细节处理

Timer的用法:1:本人称之为计时器,是asp.net官方的一种。用法即是计时所用 2:关于计时有很多中方式,本人学识有限,暂...

.net core 使用session

tip:net core 2.2后可以直接启用session了,不用在自己添加一次session依赖,本身就添加了使用nuget添加引用Microsoft.AspN...

通俗易懂,什么是.net?什么是.net Framework?什么是.net core?

朋友圈@蓝羽 看到一篇文章写的太详细太通俗了,搬过来细细看完,保证你对.NET有个新的认识理解原文地址:https://www.cnblo...