Model Binding là gì

Models:

Communication between a client (usually a browser) and the web server is very simple - strings are passed back and forth, because the client doesn't have any understanding of your fancy .NET objects. So, back in the old days of ASP Classic and ASP.NET WebForms, before the MVC framework was introduced into the .NET framework, the process of updating a Model was a bit cumbersome. First, you would have to create a FORM with all the fields that the user could change. When this FORM was posted back to the server, you would have to read each of the FORM fields and assign it to your Model. If we were to take this approach and use it with ASP.NET MVC, it would look something like this:

           

public IActionResult UpdateFromOldSchoolForm(){    WebUser webUser = LoadUserFromDatabase();    webUser.FirstName = Request.Form["txtFirstName"];    webUser.LastName = Request.Form["txtLastName"];    UpdateUserInDatabase(webUser);    return Content("User updated!");

}

Form sẽ gửi dữ liệu tới phương thức và gán nó cho các đối tượng. Tuy nhiên, ASP.NET MVC với Model Binding, View sẽ dùng dữ liệu từ Model để tạo ra ví dụ Form để thay đổi dữ liệu trong Model. Phương thức trong Controller sẽ xử lý dữ liệu đưa lên như đối tượng của Model thay vì việc ta phải tự đọc chuỗi từ FORM. Hay nói cách khác, nhờ có Model Binding mà giao tiếp giữa client và server bằng các object.

Using Model Binding

Đầu tiên, ta cần một Model đơn giản như sau:

public class WebUser{    public string FirstName { get; set; }    public string LastName { get; set; }

}

Trong Controller, chúng ta truyền một đối tượng của class này vào View. Trong thực tế, chúng ta có thể lấy WebUser từ cơ sở dữ liệu nhưng để đơn giản cho việc minh họa thì ta làm như sau:

[HttpGet]public IActionResult SimpleBinding()  {      return View(new WebUser() { FirstName = "John", LastName = "Doe" });  

}

View sẽ biết được loại Model với khai báo @model, chúng ta có thể dùng phương thức helper xây dựng FORM:

@using(var form = Html.BeginForm()){   
@Html.LabelFor(m => m.FirstName) @Html.TextBoxFor(m => m.FirstName)   
   
@Html.LabelFor(m => m.LastName) @Html.TextBoxFor(m => m.LastName)   
   

}

Kết quả ta có như sau với label và textbox để nhập thông tin cho Model:

Model Binding là gì

By default, the FORM will be posted back to the same URL that delivered it, so to handle that, we need a POST-accepting Controller method to handle the FORM submission:

[HttpPost]public IActionResult SimpleBinding(WebUser webUser){    //TODO: Update in DB here...    return Content($"User {webUser.FirstName} updated!");

}

Notice how our Controller action takes just one parameter, of the same type as the Model we passed into the View originally: The WebUser class. Behind the scenes, ASP.NET MVC will now process the FORM and assign the values found in its editable controls to the properties of the WebUser class. This is the magic of Model Binding!

Summary

Thanks to Model Binding, you can maintain relations between your Models and your Views much easier. In this article, we only scratched the surface though - there are a lot more possibilities with Model Binding, as you'll discover in some of the upcoming articles.

This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!

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.

Model Binding là gì

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 ().

Model Binding là gì

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.

Model Binding là gì

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

Model Binding là gì

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.

Model Binding là gì

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)