Thứ tư, ngày 7 tháng 12 năm 2016

Thêm phần kiểm tra tính hợp lệ đối với Model trong asp.net mvc

Ngày đăng: 11/10/2012, 8:43:55PM | Lượt xem: 5,907
Hot!
tag ,

 Với bài này, bạn sẽ học cách áp dụng các thao tác kiểm tra tính hợp lệ dữ liệu mỗi khi người dùng muốn tạo hoặc thay đổi đối tượng Task.

 Thêm các quy tắc kiểm tra tính hợp lệ dữ liệu đối với lớp Task

 
Để sử dụng thư viện hỗ trợ kiểm tra tính hợp lệ dữ liệu (data validation), bạn cần phải sử dụng câu lệnh tham chiếu đến namespace System.ComponentModel.DataAnnotations:
using System.ComponentModel.DataAnnotations;
Namespace này là một phần của .NET Framework, nó cung cấp các tập thuộc tính về tính hợp lệ dữ liệu nhằm giúp bạn có thể áp dụng nó cho lớp hoặc thuộc tính bất kỳ.
 
Bây giờ chúng ta sẽ cập nhật lớp Task để tận dụng ưu điểm của các thuộc tính Required, StringLength và Range. 
using System;
using System.ComponentModel.DataAnnotations;

namespace ToDoApp.Models
{
    public class Task
    {
        public int Id { get; set; }
        [Required(ErrorMessage = "Content is required")]
        [StringLength(400, MinimumLength = 5, ErrorMessage = "Content must be between 1 and 400")]
        public string Content { get; set; }
        public DateTime CreateDate { get; set; }
        [Required(ErrorMessage = "DueDate is required")]
        public DateTime DueDate { get; set; }
        [Required(ErrorMessage = "Priority is required")]
        [Range(1, 5, ErrorMessage = "Priority must be between 1 and 5")]
        public int Priority { get; set; }
    }
}
Các thuộc tính validation quy định các ràng buộc mà bạn muốn áp dụng đối với các thuộc tính của model. Required là thuộc tính quy định rằng trường đó phải có chứa dữ liệu, ví dụ như đối với một đối tượng kiểu Task, thì nội dung của tác vụ là trường Content không thể là rỗng được. Thuộc tính Range quy định khoảng giá trị có thể áp dụng cho trường. Thuộc tính StringLength giúp bạn quy định độ dài lớn nhất và bé nhất của một thuộc tính chuỗi.
 
Code First bảo đảm rằng các quy tắc về hợp lệ dữ liệu mà bạn quy định ở các lớp model sẽ được kiểm tra mỗi khi ứng dụng lưu dữ liệu vào database. Ví dụ, đoạn code dưới đây sẽ quăng ra ngoại lệ khi phương thức SaveChanges được gọi, bởi vì thuộc tính Priority có giá trị nằm ngoài giới hạn, và trường DueDate chưa được gán giá trị:
var db = new TaskDbContext();

var task = new Task {Content = "Build a Lumia 920 smartphone tomorrow", Priority = 6};

db.Tasks.Add(task);

db.SaveChanges();
Việc các quy tắc về hợp lệ dữ liệu được áp dụng một cách tự động sẽ giúp cho ứng dụng của bạn hoạt động hiệu quả hơn. Nó cũng giúp bạn không thể quên được việc phải kiểm tra tính hợp lệ dữ liệu trước khi lưu và hạn chế tối đa khả năng lưu dữ liệu không hoàn chỉnh vào database.
 
Giao diện lỗi hợp lệ dữ liệu trong ASP.NET MVC
 
Hãy chạy lại ứng dụng và điều hướng đến địa chỉ /Task/Create, tiếp theo hãy nhập nội dung không hợp lệ cho một tác vụ mới và click chuột vào nút Create, bạn có thể sẽ thấy các lỗi như sau:
 
Những hộp thoại chứa dữ liệu không hợp lệ sẽ được đổi thành màu đỏ và đi kèm với nó là các thông báo lỗi. Các thông điệp lỗi chính là các thông điệp mà bạn đã quy định tại các thuộc tính trong lớp Task. Việc kiểm tra tính hợp lệ dữ liệu được thực hiện ở phần server lẫn ở client. Rõ ràng bạn đã làm được một việc rất quan trọng và hữu ích mà không cần phải thay đổi bất kỳ dòng lệnh nào ở TaskController và Create.cshtml, chúng đã tự động áp dụng các quy tắc về kiểm tra hợp lệ dữ liệu mà bạn đã quy định bằng cách thuộc tính tại lớp Task.
 
Làm cách nào để việc kiểm tra tính hợp lệ dữ liệu xảy ra ở view và action Create
Có thể bạn sẽ thắc mác tại sao giao diện kiểm tra hợp lệ dữ liệu lại được tạo ra mà không cần phải thay đổi gì controller và views, chúng ta sẽ sớm được giải đáp khi xem xét các đoạn mã được Visual Studio tự động tạo ra cho chúng ta.
 
Đầu tiên là phương thức Create của TaskController. 
public ActionResult Create()
        {
            return View();
        } 

        //
        // POST: /Task/Create

        [HttpPost]
        public ActionResult Create(Task task)
        {
            if (ModelState.IsValid)
            {
                task.CreateDate = DateTime.Now;
                db.Tasks.Add(task);
                db.SaveChanges();
                return RedirectToAction("Index");  
            }

            return View(task);
        }
Phương thức thứ nhất hiển thị form Create. Phương thức thứ hai dùng để xử lý post request. Phương thức thứ hai sử dụng phương thức ModelState.IsValid để kiểm tra xem thử tác vụ có lỗi hợp lệ dữ liệu nào không? Phương thức này sẽ kiểm tra tất cả các luật mà bạn quy định về kiểm tra tính hợp lệ dữ liệu đối với đối tượng Tasks, trong trường hợp có lỗi, thì action sẽ hiển thị lại form nhập dữ liệu để hiển thị lỗi và cho phép bạn nhập lại dữ liệu cho đúng. Nếu không có lỗi nào, phương thức sẽ lưu đối tượng Task mới vào database.
 
Mã lệnh tiếp theo đó là tập tin Create.cshtml mà bạn đã yêu cầu Visual Studio tạo ra trong bài viết trước, view này dùng để hiển thị form nhập liệu để tạo mới Task, hoặc hiển thị thông tin Task có lỗi không hợp lệ và chưa được chấp nhận lưu vào database.
@model ToDoApp.Models.Task
@{
    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>Task</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.Content)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Content)
            @Html.ValidationMessageFor(model => model.Content)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.Priority)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Priority)
            @Html.ValidationMessageFor(model => model.Priority)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.DueDate)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.DueDate)
            @Html.ValidationMessageFor(model => model.DueDate)
        </div>

        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>
Bạn cần lưu ý đến phương thức Html.EditorFor(), phương thức này giúp sinh ra mã HTML tương ứng với mỗi thuộc tính của lớp Task. Tiếp theo, cần phải quan tâm đến phương thức Html.ValidationMessageFor, phương thức này nhằm hiển thị các lỗi về kiểm tra hợp lệ dữ liệu đối với mỗi thuộc tính của đối tượng Task. Ưu điểm của cách tiếp cận này đó là controller và view đều không biết gì về các quy tắc kiểm tra tính hợp lệ dữ liệu, các quy tắc này chỉ được quy định ở lớp Task.
 
Nếu bạn muốn thay đổi quy tắc kiểm tra hợp lệ dữ liệu, bạn chỉ cần thay đổi tại một nơi, và đặc biệt là bạn có thể sử dụng nó tại mọi nơi. Điều này sẽ giúp cho mã lệnh sạch sẽ và dễ bảo trì. Nói một cách khác bạn đang áp dụng nguyên lý DRY (Don’t Repeat Yourself).
 
Quy định định dạng cho các trường của lớp Task
 
Namespace System.ComponentModel.DataAnnotations cung cấp các thuộc tính quy định định dạng cho các trường. Bạn sẽ áp dụng thuộc tính DisplayFormat và thuộc tính DataType.
 
Bây giờ bạn hãy thử mở tập tin /Model/AccountModels, bạn sẽ thấy định nghĩa của LogonModel là:
public class LogOnModel
    {
        [Required]
        [Display(Name = "User name")]
        public string UserName { get; set; }

        [Required]
        [DataType(DataType.Password)]
        [Display(Name = "Password")]
        public string Password { get; set; }

        [Display(Name = "Remember me?")]
        public bool RememberMe { get; set; }
    }
Và view /Views/Account/Logon.cshtml được định nghĩa:
@model ToDoApp.Models.LogOnModel

@{
    ViewBag.Title = "Log On";
}

<h2>Log On</h2>
<p>
    Please enter your user name and password. @Html.ActionLink("Register", "Register") if you don't have an account.
</p>

<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>

@Html.ValidationSummary(true, "Login was unsuccessful. Please correct the errors and try again.")

@using (Html.BeginForm()) {
    <div>
        <fieldset>
            <legend>Account Information</legend>

            <div class="editor-label">
                @Html.LabelFor(m => m.UserName)
            </div>
            <div class="editor-field">
                @Html.TextBoxFor(m => m.UserName)
                @Html.ValidationMessageFor(m => m.UserName)
            </div>

            <div class="editor-label">
                @Html.LabelFor(m => m.Password)
            </div>
            <div class="editor-field">
                @Html.EditorFor(m => m.Password)
                @Html.ValidationMessageFor(m => m.Password)
            </div>

            <div class="editor-label">
                @Html.CheckBoxFor(m => m.RememberMe)
                @Html.LabelFor(m => m.RememberMe)
            </div>

            <p>
                <input type="submit" value="Log On" />
            </p>
        </fieldset>
    </div>
}
LogonModel được sử dụng để giúp người dùng đăng nhập, điều hay là, mặc dù ở view Logon.cshtml chỉ sử dụng dòng lệnh @Html.EditorFor(m => m.Password), thì khi bạn chạy ứng dụng và vào địa chỉ /Acount/Logon, bạn hãy thử nhập vào ô Password, bạn sẽ thấy nội dung nhập sẽ bị che mờ do ASP.NET MVC đã sinh ra mã HTML dạng <input type=”password” />. ASP.NET MVC đã dựa vào thuộc tính DataType[DataType.Password] nằm ở phía trên của định nghĩa trường Password trong lớp LogOnModel để sinh ra mã HTML tương ứng.
Tiếp theo bạn hãy cập nhật định nghĩa cho lớp Task như bên dưới:
using System;
using System.ComponentModel.DataAnnotations;

namespace ToDoApp.Models
{
    public class Task
    {
        public int Id { get; set; }
        [Required(ErrorMessage = "Content is required")]
        [StringLength(400, MinimumLength = 5, ErrorMessage = "Content must be between 1 and 400")]
        public string Content { get; set; }
        public DateTime CreateDate { get; set; }
        [Required(ErrorMessage = "DueDate is required")]
        [DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}")]
        public DateTime DueDate { get; set; }
        [Required(ErrorMessage = "Priority is required")]
        [Range(1, 5, ErrorMessage = "Priority must be between 1 and 5")]
        public int Priority { get; set; }
    }
}
 
Sự khác biệt là, ở phía trên chúng ta có thêm một dòng nhằm định nghĩa thuộc tính (annotation) DisplayFormat cho trường DueDate, trong đó chúng ta quy định định dạng dùng để hiển thị ngày tháng cho trường DueDate như sau [DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}")]. Và kết quả là:
Nguồn d.jou.vn
 Chia sẻ qua: 
Hot!
Ý kiến bạn đọc

These items will be permanently deleted and cannot be recovered. Are you sure?

Gallery

image

Maecenas viverra rutrum pulvinar

Maecenas viverra rutrum pulvinar! Aenean vehicula nulla sit amet metus aliquam et malesuada risus aliquet. Vestibulum rhoncus, dolor sit amet venenatis porta, metus purus sagittis nisl, sodales volutpat elit lorem…

Read more

Text Links

Thiết kế logo chuyên nghiệp Insky
DAFABET
W88 w88b.com/dang-ky-tai-khoan-w88
W88
Copyright © 2011 - 2012 vietshare.vn by phamkhuong102@gmail.com doanhkisi2315@gmail.com. All rights reserved.