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

原文链接: http://www.cnblogs.com/zhanghonjiang2011/archive/2012/05/09/2491036.html

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

猜你喜欢

转载自blog.csdn.net/weixin_30639719/article/details/94800033