.NET Core MVC3 数据模型验证的使用
这里我先粘贴一个已经加了数据验证的实体类PeopleModel,然后一一介绍。
using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Threading.Tasks; namespace Model实体数据验证.Model { /// <summary> /// 这里将指定PeopleModel自身的Required、StringLength等验证通过后,再进行PeopleModelVaildation中的CheckModel验证 /// </summary> [CustomValidation(typeof(PeopleModelVaildation), "CheckModel")] public class PeopleModel { /// <summary> /// 姓名 /// </summary> [Required(ErrorMessage = "姓名不能为空")] [StringLength(5, MinimumLength = 2, ErrorMessage = "姓名的长度为{2}至{1}个字符")] public string Name { get; set; } /// <summary> /// 年龄 /// </summary> [Required(ErrorMessage = "年龄不能为空")] [Range(18, 60, ErrorMessage = "年龄的范围在{1}至{2}之间")] public string Age { get; set; } /// <summary> /// 性别 /// </summary> [Required(ErrorMessage = "性别不能为空")] public string Gender { get; set; } /// <summary> /// 生日 /// </summary> [Required(ErrorMessage = "生日不能为空")] public DateTime Brithday { get; set; } } /// <summary> /// 这个验证在实体内部的验证通过后,才会执行 /// </summary> public class PeopleModelVaildation { public static ValidationResult CheckModel(object value, ValidationContext validationContext) { ///如果value是PeopleModel的实体类型,则验证value中指定的数据类型。 if (value is PeopleModel item) { ///验证生日 if (item.Brithday>DateTime.Now) { return new ValidationResult("生日信息错误"); } } //验证成功 return ValidationResult.Success; } } }
我们需要在实体类中引入命名空间:using System.ComponentModel.DataAnnotations
验证Name字段不能为空:[Required(ErrorMessage = "姓名不能为空")]
/// <summary> /// 姓名 /// </summary> [Required(ErrorMessage = "姓名不能为空")] public string Name { get; set; }
Required:非空验证,ErrorMessage:是自定义错误提示信息
效果如下:
验证Name字段字符长度:[StringLength(5, MinimumLength = 2, ErrorMessage = "姓名的长度为{2}至{1}个字符")]
[StringLength(5, MinimumLength = 2, ErrorMessage = "姓名的长度为{2}至{1}个字符")] public string Name { get; set; }
StringLength:字符长度验证,5:表示字符串的最大长度,MinimumLength:表示字符串的最小长度,ErrorMessage:是自定义错误提示信息
效果如下:
验证Age字段值范围:[Range(18, 60, ErrorMessage = "年龄的范围在{1}至{2}之间")]
[Range(18, 60, ErrorMessage = "年龄的范围在{1}至{2}之间")] public string Age { get; set; }
Range:验证字符取值范围,18:表示最小年龄,60:表示最大年龄,ErrorMessage:是自定义错误提示信息
效果如下:
验证两次密码输入是否相同(比如用户修改密码时,需要验证用户两次输入的新密码是否一致):[Compare("PwdOne", ErrorMessage = "两次密码输入不一致")]
/// <summary> /// 第一次输入的密码 /// </summary> public string PwdOne { get; set; } /// <summary> /// 第二次输入的密码 /// </summary> [Compare("PwdOne", ErrorMessage = "两次密码输入不一致")] public string PwdTwo { get; set; }
Compare:验证两个字段内容是否相同,"PwdOne":需要数据对比的字段名,ErrorMessage:是自定义错误提示信息
下面我们新建一个ModelFilter过滤器并继承ActionFilterAttribute,用来接收实体类中的ErrorMessage信息,并返回给客服端
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace Model实体数据验证.Common { /// <summary> /// 实体验证过滤器 /// 需要在Starup.cs中的ConfigureServices中注册 /// </summary> public class ModelFilter:ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext context) { if (!context.ModelState.IsValid) { ///实体验证未通过 string ErrorMsg = string.Empty; var ErrorsModel = context.ModelState.Values.Where(item => { return item.Errors.Count > 0; }).ToList().FirstOrDefault(); if (ErrorsModel != null) { ErrorMsg = ErrorsModel.Errors[0].ErrorMessage; } context.Result = new JsonResult(ErrorMsg); return; } } } }
这里还需要给ModelFilter过滤器类在Startup.cs类中注入服务,具体代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.DependencyInjection; using Model实体数据验证.Common; namespace Model实体数据验证 { public class Startup { // This method gets called by the runtime. Use this method to add services to the container. // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940 public void ConfigureServices(IServiceCollection services) { services.AddMvc(); //给ModelFilter注入服务 services.AddMvc(filter=>filter.Filters.Add<ModelFilter>()); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseMvc(routes=> { routes.MapRoute( name:"default", template:"{controller=Home}/{action=Index}/{id?}" ); }); } } }
HomeController代码:
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Model实体数据验证.Model; namespace Model实体数据验证.Controllers { public class HomeController : Controller { public IActionResult Index() { return View(); } [HttpPost] public IActionResult Add(PeopleModel model) { return Json("验证成功"); } } }
Html代码:
@{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>Index</title> </head> <body> <div> <label>姓名:</label> <br /> <input type="text" id="Name"/> <br /> <br /> <label>年龄:</label> <br /> <input type="text" id="Age"/> <br /> <br /> <label>性别:</label> <br /> <input type="text" id="Gender"/> <br /> <br /> <label>生日:</label> <br /> <input type="text" id="Brithday"/> <br /> <br /> <button type="button" id="submit">提交</button> </div> <script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script> <script type="text/javascript"> $("#submit").click(function () { $(function () { var data = {}; data.Name = $("#Name").val(); data.Age = $("#Age").val(); data.Gender = $("#Gender").val(); data.Brithday = $("#Brithday").val(); $.ajax({ type: "POST", url: "/Home/Add", dataType: "JSON", data: data, success: function (obj) { alert(obj); }, error: function (er) { console.log(er); } }); }); }); </script> </body> </html>
现在来看下效果:
Demo下载地址:https://pan.baidu.com/s/1NZ68edipDOvNKmMWXb0rgg
密码:072d