建立ASP.NET Core MVC应用程序(6)-添加验证

建立ASP.NET Core MVC应用程序(6)-添加验证

DRY原则

DRY("Don't Repeat Yourself")是MVC的设计原则之一。ASP.NET MVC鼓励你只定义一次功能或行为,而后在应用程序中各处进行使用。这会大大
减小须要编写的代码量,使你的代码不容易出错,更便于测试和维护。html

MVC和Entity Framework Core Code First所提供的验证功能是实际应用中DRY原则的一个很好的实例。你能够在一个地方(在模型类中)声明指定的验证规则,在整个应用中生效。数据库

在 User 模型类中添加验证规则

DataAnnotations提供了一组内置的验证特性,你能够应用在任何类或者属性中。(字也包含了相似于DataType这样的格式化特性来帮助你格式化数据而不是提供任何验证功能)浏览器

添加内置的Required,StringLength,RegularExpressionRange验证特性。服务器

public class User
{
    public int ID { get; set; }

    [Display(Name = "姓名")]
    [StringLength(10, MinimumLength = 3)]
    [Required]
    public string Name { get; set; }

    [Display(Name = "邮箱")]
    [DataType(DataType.EmailAddress)]
    public string Email { get; set; }

    [Display(Name = "身高")]
    [Required]
    [Range(150, 230)]
    public decimal Height { get; set; }

    [Display(Name = "职称")]
    public string Title { get; set; }

    [Display(Name = "部门")]
    public string Dept { get; set; }

    [Display(Name = "简介")]
    public string Bio { get; set; }
}

其中RequiredMinimumLength Attribute表示属性不能为空;但没法阻止用户输入空格来知足该验证条件。RegularExpression Attribute用来限制用户能够输入的字符。Range Attribute限制值必须在指定的范围内。StringLength Attribute可以让你设置字符串的最大长度,和可选的最小长度。值类型(例如decimal,int,float,DateTime)是自身必须的,不须要[Required] Attribute。mvc

验证错误

在输入错误的数据时,jQuery客户端验证立刻会发现错误,并显示一个错误信息。注意表单在每一个包含无效数据的字段下自动呈现适当的验证错误消息。错误会在客户端(使用JavaScript和jQuery)和服务器端执行。asp.net

你会发现你不须要修改UserController类或者Create.cshtml视图中的一行代码,就能够验证UI。以前建立的Controller和视图会自动使用你在User模型类中属性上指定的验证特性规则。使用Edit操做方法测试验证,一样会生效。async

在 Create 视图和 Create 动做方法中验证是如何触发的

你可能会好奇在没有对控制器或者视图进行更新的状况下验证UI是如何产生的。post

// GET: User/Create
public IActionResult Create()
{
    return View();
}

// POST: User/Create
// To protect from overposting attacks, please enable the specific properties you want to bind to, for
// more details see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("ID,Name,Email,Bio,Height,Title,Dept")]User user)
{
    if (ModelState.IsValid)
    {
        _context.Add(user);
        await _context.SaveChangesAsync();
        return RedirectToAction("Index");
    }
    return View(user);
}

第一个(HTTP GET)Create方法显示初始的Create表单。第二个([HttpPost])版本负责处理POST请求,经过调用ModelState.IsValid来检查是否有任何验证错误。调用该方法会验证任何已应用到对对象上的验证。若是对象有验证错误,Create方法会从新显示表单。若是没有错误,方法会保存数据到数据库。测试

在这个例子中,在客户端验证检测到错误时,表单不会POST到服务器,若是你在浏览器中禁用了JS,客户端验证将会禁用,那么HTTP POST Create方法中的ModelState.IsValid会检测任何验证错误。ui

Input Tag Helper会使用(Consume)DataAnnotations特性并在客户端产生(Produce)jQuery验证所须要的HTML属性。Validation Tag Helper负责显示验证错误。

很是Nice的是这个方案控制器和视图模板不须要知道任何实际执行的验证规则或者具体的错误消息。验证规则和错误字符串只在模型类中指定。一样的骓规则会自动地应用到任何你想要建立或者修改该Model的视图模板。

当你想更改验证逻辑时,你只须要在一个地方给Model添加验证特性。不用担忧应用的不一样部分执行不一样的验证规则 - 全部的验证逻辑在同一个地方定义,在各处使用。这意味着你充分遵循了DRY原则。

使用 DataType Attributes

System.ComponentModel.DataAnnotations命名空间提供了内置的验证特性之外的格式化特性。好比:

[Display(Name = "生日")]
[DataType(DataType.Date)]
public DateTime BirthDate { get; set; }

[Range(8000, 10000)]
[DataType(DataType.Currency)]
public decimal Salary { get; set; }

DataType特性只用于视图引擎对数据进行格式化(以及为URL提供<a>标签和为Email提供<a href="mailto:EmailAddress.com">)。你可使用RegularExpression特性验证数据的格式。DataType特性用于指定比数据库自己类型更为具体的数据类型,它们不是验证特性,这本例中,咱们只须要跟踪日期,而不须要具体的时间。

DataType枚举中提供了不少的数据类型,例如Date, Time, PhoneNumber, Currency, EmailAddress等。DataType特性可让应用自动提供特定数据类型的特征。例如,DataType.EmailAddress能够建立mailto:连接,DataType.Date能够在浏览器提供一个日期选择器。DataType特性会产生HTML 5浏览器所支持的HTML 5 data-属性。DataType不提供任何验证。

DataType.Date不是指定日期的显示格式。默认状况,数据字段默认的显示格式是基于服务器的CultureInfo设置来决定的。

我的博客

个人我的博客

相关文章
相关标签/搜索