EF Code First和MVC3进行类级别模型验证

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>

下图是违反了业务逻辑规则的截图

EF Code First和MVC3进行类级别模型验证

 

 

你可能感兴趣的:(first)