MVC 中的DataAnnotation Validation attributes[数据注释验证属性] 提供了一种简单的方法来验证模型类中的单个属性值。
那么CodeFirst是否支持模型对象应用级类上的验证方法,只管验证规则而不需要涉及到其他的属性值?答案是肯定的:只需要在模型类中实现IValidatableObject接口。
下面是一个在Product模型类中使用IValidatableObject[包含在System.ComponentModel.DataAnnotations空间内]接口,实现Validate方法,下面实现两个验证规则的实例。
1、如果产品处于断货状态,新产品不能被订货。
2、如果库存超过100unit,那么新产品不能被订购。
下面就来实现上述验证规则
第一步:定义产品模型类并继承IValidatableObject接口,实现其方法Validate
public class Product:IValidatableObject { public int ProductID { get; set; } public int CategoryID { get; set; } public string ProductName { get; set; } public Decimal? UnitPrice { get; set; } public Int16? UnitsInStock { get; set; } public Int16? UnitsOnOrder { get; set; } public bool Discontinued { get; set; } /// <summary> /// 验证多个业务逻辑 /// </summary> /// <param name="validateContext"></param> /// <returns></returns> public IEnumerable<ValidationResult> Validate(ValidationContext validateContext) { if ((UnitsOnOrder > 0) && (Discontinued)) //这里注意 yield 关键字向编译器指示它所在的方法是迭代器 yield return new ValidationResult("Can't order discontinued products!", new[] { "UnitsOnOrder" }); //指定UnitsOnOrder 属性的错误 描述 if ((UnitsInStock > 100) && (UnitsOnOrder > 0)) yield return new ValidationResult("We already have a lot of these!", new[] { "UnitsInStock" }); } }
第二步:创建ProductController,然后建立名为Create 的ActionResult方法
第一个Create()方法实现一种/Product/Create URL来处理HTTP-GET请求,并显示HTML表单以供填写。第二个Create()方法实现另一种/Product/Create URL来处理HTTP-Post请求——它取出提交的表单数据,保证它的有效性,如果有效的话将其保存在数据库内。 如果验证有问题,它会重新显示表单和它提交的值。
public class ProductController : Controller { DbContexts context = new DbContexts(); // // GET: /Product/ public ActionResult Create() { return View(); } [HttpPost] public ActionResult Create(Product product) { if (!ModelState.IsValid) { context.products.Add(product); //product.UnitsOnOrder = 5; //product.Discontinued = true; var errors = context.GetValidationErrors(); if (errors.Count() > 0) { return View(product); } context.SaveChanges(); } return View(product); } }
第三步:生成View
View Code
@model ClassLevelModelValidate.Models.Product @{ ViewBag.Title = "Create"; } <h2>Create</h2> <script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script> @using (Html.BeginForm()) { @Html.ValidationSummary(true) <fieldset> <legend>Product</legend> <div class="editor-label"> @Html.LabelFor(model => model.CategoryID) </div> <div class="editor-field"> @Html.EditorFor(model => model.CategoryID) @Html.ValidationMessageFor(model => model.CategoryID) </div> <div class="editor-label"> @Html.LabelFor(model => model.ProductName) </div> <div class="editor-field"> @Html.EditorFor(model => model.ProductName) @Html.ValidationMessageFor(model => model.ProductName) </div> <div class="editor-label"> @Html.LabelFor(model => model.UnitPrice) </div> <div class="editor-field"> @Html.EditorFor(model => model.UnitPrice) @Html.ValidationMessageFor(model => model.UnitPrice) </div> <div class="editor-label"> @Html.LabelFor(model => model.UnitsInStock) </div> <div class="editor-field"> @Html.EditorFor(model => model.UnitsInStock) @Html.ValidationMessageFor(model => model.UnitsInStock) </div> <div class="editor-label"> @Html.LabelFor(model => model.UnitsOnOrder) </div> <div class="editor-field"> @Html.EditorFor(model => model.UnitsOnOrder) @Html.ValidationMessageFor(model => model.UnitsOnOrder) </div> <div class="editor-label"> @Html.LabelFor(model => model.Discontinued) </div> <div class="editor-field"> @Html.EditorFor(model => model.Discontinued) @Html.ValidationMessageFor(model => model.Discontinued) </div> <p> <input type="submit" value="Create" /> </p> </fieldset> } <div> @Html.ActionLink("Back to List", "Index") </div>
下图是违反了业务逻辑规则的截图
转载于:https://www.cnblogs.com/zhanghonjiang2011/archive/2012/05/09/2491036.html