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>

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

 

 

转载于:https://www.cnblogs.com/zhanghonjiang2011/archive/2012/05/09/2491036.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的登录注册功能的示例: 首先,需要创建一个 ASP.NET MVC 项目,并引入 Entity Framework。以下是代码示例: 在 Models 文件夹下创建一个名为 User 的模型类: ```csharp public class User { public int Id { get; set; } public string Username { get; set; } public string Password { get; set; } } ``` 接着,在 DbContext 中添加 DbSet<User> 属性: ```csharp public class ApplicationDbContext : DbContext { public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { } public DbSet<User> Users { get; set; } } ``` 在 Controllers 文件夹下创建一个名为 AccountController 的控制器,添加以下方法: ```csharp public class AccountController : Controller { private readonly ApplicationDbContext _context; public AccountController(ApplicationDbContext context) { _context = context; } public IActionResult Register() { return View(); } [HttpPost] public async Task<IActionResult> Register(RegisterViewModel model) { if (ModelState.IsValid) { var user = new User { Username = model.Username, Password = model.Password }; _context.Users.Add(user); await _context.SaveChangesAsync(); return RedirectToAction("Login"); } return View(model); } public IActionResult Login() { return View(); } [HttpPost] public async Task<IActionResult> Login(LoginViewModel model) { var user = await _context.Users.FirstOrDefaultAsync(u => u.Username == model.Username && u.Password == model.Password); if (user != null) { // 登录成功 return RedirectToAction("Index", "Home"); } ModelState.AddModelError("", "用户名或密码不正确"); return View(model); } } ``` 其中,Register 和 Login 方法分别用于显示注册和登录的页面;Register 和 Login 的 HttpPost 版本用于处理表单提交。 接着,在 Views 文件夹下创建一个名为 Account 的文件夹,添加以下视图: Register.cshtml: ```html @model RegisterViewModel <h2>注册</h2> <form asp-action="Register" method="post"> <div class="form-group"> <label for="username">用户名</label> <input type="text" class="form-control" id="username" name="Username" value="@Model.Username" required> </div> <div class="form-group"> <label for="password">密码</label> <input type="password" class="form-control" id="password" name="Password" value="@Model.Password" required> </div> <button type="submit" class="btn btn-primary">注册</button> </form> ``` Login.cshtml: ```html @model LoginViewModel <h2>登录</h2> <form asp-action="Login" method="post"> <div class="form-group"> <label for="username">用户名</label> <input type="text" class="form-control" id="username" name="Username" value="@Model.Username" required> </div> <div class="form-group"> <label for="password">密码</label> <input type="password" class="form-control" id="password" name="Password" required> </div> <button type="submit" class="btn btn-primary">登录</button> </form> ``` 最后,在 ViewModel 文件夹下创建两个名为 RegisterViewModel 和 LoginViewModel 的视图模型类: ```csharp public class RegisterViewModel { [Required] public string Username { get; set; } [Required] public string Password { get; set; } } public class LoginViewModel { [Required] public string Username { get; set; } [Required] public string Password { get; set; } } ``` 以上就是一个简单的登录注册功能的实现。当用户注册时,会将用户名和密码保存到数据库中;当用户登录时,会从数据库中查找是否有匹配的用户记录。如果有,则登录成功,否则显示错误消息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值