ASP.NET - MVC - Model Binding

Model Binding

Trong phần này, bạn sẽ tìm hiểu về liên kết mô hình trong khung MVC.

Để hiểu ràng buộc mô hình trong MVC, trước tiên hãy xem cách bạn có thể nhận các yêu cầu từ http trong phương thức hành động bằng cách sử dụng kiểu ASP.NET truyền thống. Hình dưới đây cho thấy cách bạn có thể nhận các giá trị từ yêu cầu HttpGET và HttpPOST bằng cách sử dụng trực tiếp đối tượng Request trong phương thức hành động.

Nhìn hình trên chúng ta sẽ thấy,  chúng ta sử dụng đối tượng Request.QueryString and Request (Request.Form) để nhận giá trị từ  HttpGet và HttpPOST. Truy cập các giá trị yêu cầu bằng cách sử dụng đối tượng Request là một hoạt động cồng kềnh và lãng phí thời gian.

Với liên kết mô hình, framework MVC chuyển đổi các giá trị yêu cầu từ http (từ chuỗi truy vấn hoặc form) thành các tham số phương thức hành động. Các tham số này có thể là kiểu nguyên thủy hoặc kiểu phức tạp.

Liên kết với kiểu nguyên thủy

Các  httpGET nhúng dữ liệu vào chuỗi truy vấn. Framework MVC tự động chuyển đổi một chuỗi truy vấn thành các tham số của phương thức hành động. Ví dụ: chuỗi truy vấn "id" trong yêu cầu GET sau đây sẽ tự động được ánh xạ tới tham số id của phương thức hành động Edit ().

Có thể có nhiều tham số trong phương thức hành động với các loại dữ liệu khác nhau. Các giá trị chuỗi truy vấn sẽ được chuyển đổi thành tham số dựa trên tên phù hợp.

Ràng buộc này là trường hợp đặc biệt. Vì vậy, tham số "id" có thể là "ID" hoặc "Id".

Ví dụ http://localhost/Student/Edit?id=1&name=John sẽ ánh xạ tới id và tham số tên của phương thức hành động Edit  sửa sau. 

public ActionResult Edit(int id, string name)
{            
    // do something here
            
    return View();
}

Liên kết với kiểu phức tạp
Model cũng hoạt động trên các kiểu phức tạp. Liên kết Model  trong Framework MVC tự động chuyển đổi dữ liệu trường form của đối tượng HttpPOST thành các thuộc tính của một tham số kiểu phức tạp.

public class Student
{
    public int StudentId { get; set; }
    [Display(Name="Name")]
    public string StudentName { get; set; }
    public int Age { get; set; }
    public Standard standard { get; set; }
}

public class Standard
{
    public int StandardId { get; set; }
    public string StandardName { get; set; }
}

Bây giờ, chúng ta có thể tạo một phương thức hành động có các tham số là kiểu Student. Trong ví dụ sau, phương thức Edit (HttpPost) có  tham số là kiểu Student.

[HttpPost]
public ActionResult Edit(Student std)
{
    var id = std.StudentId;
    var name = std.StudentName;
    var age = std.Age;
    var standardName = std.standard.StandardName;

    //update database here..

    return RedirectToAction("Index");
}

Framework MVC sẽ tự động ánh xạ các giá trị trong Form sang tham số kiểu Student khi form được submit đến phương thức Edit.

Sử dụng FormCollection để gửi dữ liệu từ View lên Action

Bind Attribute

ASP.NET MVC cũng cho phép bạn chỉ định các thuộc tính nào của lớp Model mà bạn muốn liên kết. 

Trong ví dụ sau, phương thức hành động Edit sẽ chỉ liên kết thuộc tính StudentId và StudentName của Model Student.

[HttpPost]
public ActionResult Edit([Bind(Include = "StudentId, StudentName")] Student std)
{
    var name = std.StudentName;
           
    //write code to update student 
            
    return RedirectToAction("Index");
}

Chúng ta cũng có thể sử dụng các thuộc tính loại trừ như dưới đây.

HttpPost]
public ActionResult Edit([Bind(Exclude = "Age")] Student std)
{
    var name = std.StudentName;
           
    //write code to update student 
            
    return RedirectToAction("Index");
}

Thuộc tính Bind sẽ cải thiện hiệu suất bằng cách chỉ liên kết các thuộc tính mà bạn cần.

Liên kết mô hình bên trong

Như bạn đã thấy rằng ràng buộc Model tự động chuyển đổi các giá trị yêu cầu thành một đối tượng kiểu nguyên thủy hoặc phức tạp. Model ràng buộc là một quá trình hai bước. Đầu tiên, nó thu thập các giá trị từ yêu cầu http đến và sau đó, điền vào kiểu nguyên thủy hoặc kiểu phức tạp với các giá trị này.

Các giá trị mặc định đánh giá từ các nguồn sau:

  1. Các tham số hành động bị ràng buộc trước đó, khi hành động là hành động con
  2. Các trườngForm (Request.Form)
  3. Các giá trị thuộc tính trong JSON (Request.InputStream), nhưng chỉ khi yêu cầu là một AJAX
  4. Dữ liệu Route (RouteData.Values)
  5. Các tham số Querystring (Request.QueryString)
  6. Posted files (Request.Files)