010. 使用微软提供的校验插件
后台类代码:(注意看此类上面的提示, 此类是自动生成的, 这种方法打特性(标签)的话, 再生成一次就会被覆盖, 解决方法, 会放到后面介绍)
//------------------------------------------------------------------------------ // <auto-generated> // 此代码是根据模板生成的。 // // 手动更改此文件可能会导致应用程序中发生异常行为。 // 如果重新生成代码,则将覆盖对此文件的手动更改。 // </auto-generated> //------------------------------------------------------------------------------ namespace MvcCRUDDemo { using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; public partial class OrderInfo { //使用微软提供的校验插件, 微软提供了四种类型的校验 //1. 字符串长度校验; 2. 非空校验(必填项); 3. 范围校验; 4. 正则表达式 //分别如下 [Required(ErrorMessage ="*")] //非空校验 public int Id { get; set; } //字符串长度校验 [StringLength(5, ErrorMessage = "请输入2~5个字符", MinimumLength = 2)] [Required(ErrorMessage = "*")] public string BookName { get; set; } [Range(18,120,ErrorMessage ="数字必须在18~120之间")] //范围校验 [RegularExpression(@"")] //邮箱格式字符串 public string BookAuth { get; set; } public int UserInfo_Id { get; set; } public virtual UserInfo UserInfo { get; set; } } }
前台使用的时候的代码:
<head> <meta name="viewport" content="width=device-width" /> <script src="~/Scripts/jquery-1.8.0.js"></script> <script src="~/Scripts/jquery.validate.js"></script> @*需要引入隐式的验证js文件, 当然请注意, 这种方法也就是在使用Html.的时候, 才会去校验, 而在 使用原生的手写的<input name="BookName" /> 的这种标签, 是不会进行校验的*@ <script src="~/Scripts/jquery.validate.unobtrusive.js"></script> @*其实关键就是添加一个隐式的引用的js, 下面的代码都是自动生成的*@ <title>Create</title> </head> <body> @using (Html.BeginForm()) { @Html.AntiForgeryToken() <div class="form-horizontal"> <h4>OrderInfo</h4> <hr /> @Html.ValidationSummary(true, "", new { @class = "text-danger" }) <div class="form-group"> @Html.LabelFor(model => model.BookName, htmlAttributes: new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.BookName, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.BookName, "", new { @class = "text-danger" }) </div> </div> <div class="form-group"> @Html.LabelFor(model => model.BookAuth, htmlAttributes: new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.BookAuth, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.BookAuth, "", new { @class = "text-danger" }) </div> </div> @*<div class="form-group"> @Html.LabelFor(model => model.UserInfo_Id, "UserInfo_Id", htmlAttributes: new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.DropDownList("UserInfo_Id", null, htmlAttributes: new { @class = "form-control" }) @Html.ValidationMessageFor(model => model.UserInfo_Id, "", new { @class = "text-danger" }) </div> </div>*@ <div class="form-group"> <div class="col-md-offset-2 col-md-10"> <input type="submit" value="Create" class="btn btn-default" /> </div> </div> </div> } <div> @Html.ActionLink("Back to List", "Index") </div> </body> </html>
效果:
生成的源码截图:
修改提示字符为红色, 上图已经标识出提示处使用的<span>标签使用的样式文件了, 所以只需要针对性的添加即可, 其实也可以修改该样式:
<head> <meta name="viewport" content="width=device-width" /> <script src="~/Scripts/jquery-1.8.0.js"></script> <script src="~/Scripts/jquery.validate.js"></script> @*需要引入隐式的验证js文件, 当然请注意, 这种方法也就是在使用Html.的时候, 才会去校验, 而在 使用原生的手写的<input name="BookName" /> 的这种标签, 是不会进行校验的*@ <script src="~/Scripts/jquery.validate.unobtrusive.js"></script> <title>Create</title> <style type="text/css"> /*验证都是红色, 所以更改验证后文本的提示颜色, 这只是一个思路*/ .field-validation-eror { color:red; } </style> </head>
效果:
后台校验代码:
public ActionResult Create() { //MVC自己会处理校验, 也就是说在MVC中 , 校验是前台后台使用同样一种方式进行, 可以看下微软自动生成的代码, 也是这样写的 if (ModelState.IsValid) { } return View(); }
使用部分类(伙伴类), 解决特性被冲掉的可能性, 在MVC5中好像已经不会被冲掉了, 但是我也不确定, 下面的操作还是针对OrderInfo类来操作:
新建一部分类(伙伴类), 当然类名也叫OrderInfo了:
自动生成的类现在代码如下:
部分类(伙伴类)的代码如下, 一定要保证在同一个命名空间下:
namespace MvcCRUDDemo { using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; //这个类下面是空的, 然后在这个类上面打上标签, 这个标签的意思就是使得OrderInfo这个类拥有两个类的元数据信息, 所以说, 现在的OrderInfo不仅有自己的元数据信息, 还有OrderInfoValidate的元数据信息; 返回头把另外一个OrderInfo中的元数据删除试试看 [MetadataType(typeof(OrderInfoValidate))] public partial class OrderInfo { } /// <summary> /// 以后就是用这个类进行验证, 注意此类中字段名一定要和OrderInfo中的字段名保持一致 /// </summary> public class OrderInfoValidate { //使用微软提供的校验插件, 微软提供了四种类型的校验 //1. 字符串长度校验; 2. 非空校验(必填项); 3. 范围校验; 4. 正则表达式 //分别如下 [Required(ErrorMessage = "*")] //非空校验 public int Id { get; set; } //字符串长度校验 [StringLength(5, ErrorMessage = "请输入2~5个字符", MinimumLength = 2)] [Required(ErrorMessage = "*")] public string BookName { get; set; } [Range(18, 120, ErrorMessage = "数字必须在18~120之间")] //范围校验 [RegularExpression(@"^\s*([A-Za-z0-9_-]+(\.\w+)*@(\w+\.)+\w{2,5})\s*$")] //邮箱格式字符串 public string BookAuth { get; set; } public int UserInfo_Id { get; set; } public virtual UserInfo UserInfo { get; set; } }
运行一下效果还是和之前的一样, 但是这样就不担心在自动生成的时候, 冲掉特性标签了