ASP.NET Core MVC自定义服务端验证

原创 Laughing  2017-10-29 11:52  阅读 238 次 评论 1 条

在ASP.NET Core中,微软为我们预置了好多的验证方法,这些验证方法位于System.ComponentModel.DataAnnotations命名空间。出了使用自带的验证规则外,我们也可以自己定义自己的验证规则,本篇我们主要讲解的是自定义服务端的验证规则。

继承ValidationAttribute类,重写IsValid方法

重写IsValid()方法,如果返回true代表验证通过,否则代表验证失败。出了重写IsValid()方法之外,我们可以FormatErrorMessage()方法,返回格式化后的错误信息。

下面的代码,我们定义一个验证产品价格最小价格的验证属性,如下

  1. using System;  
  2. using System.ComponentModel.DataAnnotations;  
  3.   
  4. namespace NetCoreStudy.WebUI.Extensions.Attribute.Validate  
  5. {  
  6.     public class PriceValidateAttribute : ValidationAttribute  
  7.     {  
  8.         public double MinPrice { getset; }  
  9.         public override bool IsValid(object value)  
  10.         {  
  11.             if (value == null)  
  12.             {  
  13.                 return true;  
  14.             }  
  15.             var price = Convert.ToDouble(value);  
  16.             if (price < MinPrice)  
  17.             {  
  18.                 return false;  
  19.             }  
  20.             return true;  
  21.         }  
  22.   
  23.         public override string FormatErrorMessage(string name)  
  24.         {  
  25.             return name + " 的价格低于系统限制";  
  26.         }  
  27.     }  
  28. }  

定义产品实体类,定义价格验证

这里我们定义产品的最小价格不能小于9

  1. using System;  
  2. using System.ComponentModel.DataAnnotations;  
  3. using Microsoft.EntityFrameworkCore.Metadata.Internal;  
  4. using System.ComponentModel.DataAnnotations.Schema;  
  5. using NetCoreStudy.WebUI.Extensions.Attribute.Validate;  
  6.   
  7. namespace NetCoreStudy.WebUI.Entity  
  8. {  
  9.     public class Product  
  10.     {  
  11.         [Key]  
  12.         public string ProductID { getset; }  
  13.         [RegularExpression(@"^a-zA-Z'-'\s{1,20}$")]  
  14.         public string ProductCode { getset; }  
  15.         [StringLength(50,ErrorMessage="{0的长度必须介于{2}到{1}",MinimumLength=4)]  
  16.         [Display(Name="产品名称")]  
  17.         public string ProductName { getset; }  
  18.         public string Catagory { getset; }  
  19.         public string Supplier { getset; }  
  20.         [PriceValidate(MinPrice = 9)]  
  21.         public double Price { getset; }  
  22.     }  
  23. }  

定义前台代码

  1. @model NetCoreStudy.WebUI.Entity.Product  
  2.   
  3. @using(Html.BeginForm("Index","Product","POST")){  
  4.     @Html.TextBoxFor(model=>model.Price) @Html.ValidationMessageFor(model=>model.Price)  
  5.     <input type="submit" value="提交"/>  
  6.     @ViewBag.Price  
  7. }  

定义控制器代码

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Threading.Tasks;  
  5. using Microsoft.AspNetCore.Mvc;  
  6.   
  7. // For more information on enabling MVC for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860  
  8. using Microsoft.AspNetCore.Http;  
  9. using NetCoreStudy.WebUI.Entity;  
  10.   
  11. namespace NetCoreStudy.WebUI.Controllers  
  12. {  
  13.     public class VtoCController : Controller  
  14.     {  
  15.         // GET: /<controller>/  
  16.         public IActionResult Index()  
  17.         {  
  18.               
  19.             return View();  
  20.         }  
  21.   
  22.         public ActionResult BasicModelBinding(string name){  
  23.             ViewBag.Name = name;  
  24.             return View();  
  25.         }  
  26.   
  27.         public ActionResult DemoFormCollection(IFormCollection form){  
  28.             ViewBag.Name = form["name"];  
  29.             return View();  
  30.         }  
  31.   
  32.         public ActionResult PersonModelBinding(Person person){  
  33.             ViewBag.Name = person.Name;  
  34.             ViewBag.Age = person.Age;  
  35.             return View();  
  36.         }  
  37.   
  38.         public ActionResult MultiPersonModelBinding(Person man,Person woman){  
  39.             ViewBag.ManName = man.Name;  
  40.             ViewBag.ManAge = man.Age;  
  41.             ViewBag.WomanName = woman.Name;  
  42.             ViewBag.WomanAge = woman.Age;  
  43.             return View();  
  44.         }  
  45.   
  46.         public ActionResult PersonModelViewBinding(){  
  47.             return View();  
  48.         }  
  49.   
  50.         [HttpPost]  
  51.         public ActionResult PersonModelViewBinding(PersonModelView person){  
  52.             return View("ShowModelViewBinding",person);  
  53.         }  
  54.     }  
  55. }  

代码验证

我们通过访问http://localhost:5001/Product,价格我们输入2,然后点击提交按钮,界面会显示:Price 的价格低于系统限制

需要注意的是,这种方式实现的验证只是服务端的验证,也就是通过Model.IsValid进行验证
本文地址:https://www.lisen.me/asp-net-core-mvc-validate-server.html
版权声明:本文为原创文章,版权归 木子网 所有,欢迎分享本文,转载请保留出处!

发表评论


表情