Cách truyền dữ liệu từ controller về view có những cách nào

Truyền và lấy dữ liệu từ View chuyển sang Controller trong mô hình MVC của web asp.net gồm rất nhiều cách khác nhau.

Bạn đang xem: Truyền dữ liệu từ view sang controller

Hôm nay mình sẽ hướng dẫn các bạn 4 cách truyền dữ liệu được sự dụng 99% tại MVC và 7 cách lấy dữ liệu tại Controller mà bạn nào học mô hình này cũng phải biết, sử dụng nó trong hết quảng đời làm web theo mô hình MVC này.


Đầu tiên chúng ta hãy thảo luận về cách truyền dữ liệu từ Chế độ xem ASP.NET MVC sang Bộ điều khiển. Có bốn cách để truyền dữ liệu từ Chế độ xem sang Bộ điều khiển được giải thích bên dưới:

  1. Phương pháp tiếp cận truyền thống: Trong cách tiếp cận này, chúng ta có thể sử dụng đối tượng yêu cầu của HttpRequestBase lớp. Đối tượng này chứa tên trường đầu vào và các giá trị dưới dạng các cặp tên-giá trị trong trường hợp gửi biểu mẫu. Vì vậy, chúng ta có thể dễ dàng lấy giá trị của các điều khiển theo tên của chúng bằng cách sử dụng làm chỉ mục từ đối tượng yêu cầu trong bộ điều khiển.

    Ví dụ:
    Giả sử bạn đang có thông tin đầu vào trong biểu mẫu có tên ‘txtName‘, sau đó các giá trị của nó có thể được truy xuất trong bộ điều khiển từ đối tượng yêu cầu như bên dưới:

    string strName = Request["txtName"].ToString();
  2. Xuyên qua FormCollection: Chúng tôi cũng có thể lấy dữ liệu yêu cầu bài đăng bởi FormCollection sự vật. Đối tượng này cũng có dữ liệu được yêu cầu dưới dạng tập hợp tên / giá trị như Request sự vật.

    Ví dụ:

    [HttpPost] public ActionResult Calculate(FormCollection form) { string strName = form["txtName"].ToString(); . . . . . . . . . . . . . . . . . . . . }
  3. Thông qua Tham số: Chúng ta cũng có thể chuyển các tên trường đầu vào làm tham số cho phương thức hành động đăng bằng cách giữ các tên giống với tên trường đầu vào. Các tham số này sẽ có giá trị cho các trường đó và các loại tham số phải là string. Ngoài ra, không cần xác định các tham số trong bất kỳ trình tự cụ thể nào.

    Ví dụ:

    [HttpPost] public ActionResult Calculate(string txtName) { string strName = Convert.ToString(txtName); . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . }

    Trong tất cả các cách tiếp cận ở trên, chúng ta cần phải chuyển đổistring gõ vào string nhập do đó nếu bất kỳ phân tích cú pháp nào không thành công, thì toàn bộ hành động có thể không thành công ở đây. Ở đây chúng ta phải chuyển đổi từng giá trị để tránh bất kỳ trường hợp ngoại lệ nào, nhưng trong 4 giá trị dưới đâythứ tự phương pháp truyền dữ liệu từ chế độ xem đến bộ điều khiển, nó làm giảm số lượng mã.

  4. Liên kết mô hình được gõ mạnh với chế độ xem: Ở đây, chúng ta cần tạo một chế độ xem được đánh máy mạnh sẽ liên kết trực tiếp dữ liệu mô hình với các trường khác nhau của trang.

    Ví dụ:

    1. Tạo một mô hình với các biến thành viên được yêu cầu.

      Giả sử chúng ta có một mô hình tên là ‘Person‘với biến thành viên được đặt tên là’Name

    2. Bây giờ, hãy chuyển mô hình trống đến chế độ xem dưới dạng tham số trong hành động của bộ điều khiển.

      Ví dụ:

      public ActionResult GetName() { Person person = new Person(); return View(person); }
    3. Chuẩn bị chế độ xem được gõ mạnh để hiển thị các giá trị thuộc tính mô hình thông qua các phần tử html như bên dưới:

      Ví dụ:

      <div><%= Html.Encode(person.Name) %></div>
    4. Tạo phương thức hành động xử lý yêu cầu ĐĂNG và xử lý dữ liệu.

      Ví dụ:

      [HttpPost] public ActionResult GetPersonName(Person person) { return Content(person.Name.ToString()); }

Controller-to-View

Có ba tùy chọn để chuyển thông tin từ bộ điều khiển sang chế độ xem. Chúng được đề cập dưới đây:

  1. ViewData: Các ViewData là một Dictionary của các đối tượng có nguồn gốc từ ‘ViewDataDictionary‘lớp và nó có các khóa như string nhập và một giá trị cho các khóa tương ứng. Nó chứa một null giá trị trên mỗi lần chuyển hướng và nó cần định kiểu cho các kiểu dữ liệu phức tạp.

    Ví dụ: Gán giá trị trong hành động của bộ điều khiển như:

    ViewData["PersonName"] = "Test Name";

    Tìm nạp cái này ViewData giá trị trong View như thế này:

    <h1><%= ViewData["PersonName"] %></h1>
  2. ViewBag: ViewBag chỉ là một trình bao bọc động xung quanh ViewData và chỉ tồn tại trong ASP.NET MVC 3. ViewBag là một thuộc tính động tận dụng các tính năng động mới trong C # 4.0. Nó không yêu cầu đánh máy cho các kiểu dữ liệu phức tạp. Nó cũng chứa một null giá trị khi chuyển hướng xảy ra.

    Ví dụ: Gán giá trị trong hành động của bộ điều khiển như:

    ViewBag.PersonName= "Test Name";

    Tìm nạp cái này ViewData giá trị trong View như thế này:

    <h1><%= ViewBag.PersonName %></h1>
  3. TempData: TempData theo mặc định sử dụng phiên để lưu trữ dữ liệu, vì vậy nó gần giống như chỉ phiên, nhưng nó sẽ bị xóa khi kết thúc yêu cầu tiếp theo. Nó chỉ nên được sử dụng khi dữ liệu chỉ cần duy trì giữa hai yêu cầu. Nếu dữ liệu cần tồn tại lâu hơn thời gian đó, chúng ta nên lưu trữ lại TempData hoặc sử dụng Phiên trực tiếp.

    Ví dụ:

    In Controller : TempData["PersonName"] = "Test Name";

    Trong chế độ xem:

    <h1><%= TempData["PersonName"] %></h1>

Controller-to-Controller

Nếu nó không phải là private, chỉ cần chuyển nó dưới dạng đối tượng JSON trên URL bằng cách sử dụng tham số thứ ba trong chuyển hướng như được đưa ra trong ví dụ dưới đây:

return RedirectToAction("ActionName", "ControllerName", new { userId = id });

Nếu nó là private dữ liệu, chúng ta có thể sử dụng TempData – sẽ bị xóa ở cuối yêu cầu sau khi yêu cầu tiếp theo đọc nó.

Views:

Một View có thể tồn tại mà không có Model hay các dữ liệu khác từ backend, nhưng trong hầu hết trường hợp, bạn cần truy cập dữ liệu để Controller có thể đưa vào View. View không cần biết về Controller (tách biệt chức năng), Controller có nhiệm vụ chuẩn bị dữ liệu cho View. Có hai cách chính để thực hiện: thông qua Model, thông qua ViewData/ViewBag. Chúng ta cùng xem các phương thức.

Please notice that there will be a bit of overlap in the information provided by this article and the quick-start article on adding a Model to your project.

Using a (View) Model

Công nghệ là MVC, viết tắt của Model-View-Controller, sử dụng (View) Model là rõ ràng nhất và là cách tiếp cận chung nhất để truyền dữ liệu vào View. Chúng ta sẽ nói thêm về Model trong bài giảng này, nhưng chúng là đối tượng, thường đại diện cho đời sống thực. Bạn cũng sẽ làm quen với khái niệm "View Model" - chúng ta cũng sẽ đi sâu hơn, nhưng mô tả ngắn gọn thì View Model là Model được đưa vào View. Nó có thể là cái gì đó đã tồn tại trong dự án, giống đối tượngUser hoặc Product, hoặc một lớp bạn có thể định nghĩa dữ liệu muốn truy cập từ View.

Một Model không phải là một lớp phức tạp - về lý thuyết nó có thể đơn giản như là String, Integer hay DateTime. Nói cách khác, bất kỳ cái gì trong .NET framework có thể được dùng như Model, nhưng thực tế, Model của bạn thường là lớp chứa vài thuộc tính. Ví dụ, một Model của Product sẽ như sau:

public class Product{ public string Title { get; set; } public double Price { get; set; }

}

Liên kết giữa Model và View được thực hiện bởi Controller - nó có thể lấy đầu vào từ người dùng và trả về dữ liệu cho View, ví dụ:

public IActionResult Details(int id){ Product product = new Product() { Title = "Toilet Paper", Price = 1.99 }; return View(product);

}

Chú ý làm sao ta có thể đưa product sang View khi gọi phương thức View(). Trong View Product/Details, ta có thể định nghĩa lớp Product như là Model và View có thể dùng @model ở đầu tệp View như sau:

@model HelloMVCWorld.Models.Product

Giờ đây bạn có thể dùng Model của bạn và các thuộc tính như sau:

@model HelloMVCWorld.Models.Product<h1>@Model.Title</h1>

Price: @Model.Price

Dựa vào thực tế là bạn có thể định nghĩa Model của View, bạn sẽ truy cập vào thành phần của đối tượng thông qua IntelliSense và chương trình của bạn sẽ chạy thông qua quá trình Build, để đảm bảo rằng bạn chỉ có thể dùng thuộc tính/phương thức trong đối tượng Model.

Dynamic Views

Nếu bạn không khai báo Model cho View, sử dung @model trực tiếp. Chúng ta cùng tìm hiểu Dynamic View, tuy không hay sử dụng vì bạn sẽ bỏ qua IntelliSense và kiểm tra thuộc tính trong thời gian biên dịch.

Vậy, bạn nên xem ví dụ trên và bỏ khai báo @model trong View và làm thế nào để chương trình vẫn hoạt động. Trong trường hợp này, Model có thể xem như đối tượngdynamic, bạn có thể truy nhập vào các thuộc tính mà không cần trình biên dịch kiểm tra nó có tồn tại hay không. Tất nhiên điều đó cũng có nghĩa là nếu bạn cố truy cập vào các thuộc tính không tồn tại, thì trang sẽ bị lỗi khi chạy. Khi đó, view động cũng không có nhiều ý nghĩa.

ViewData/ViewBag

Cũng là một cách tiếp cận để đưa dữ liệu vào View, bạn có thể dùng ViewData/ViewBag. Bạn chỉ cần đưa vào Controller và sau đó có thể truy cập vào dữ liệu trong View. Rất dễ dàng như ví dụ sau:

public IActionResult DetailsViewData(int id){ ViewBag.ProductTitle = "Toilet Paper"; ViewBag.ProductPrice = 1.99; return View();

}

Bây giờ bạn có thể truy cập vào dữ liệu trong View dễ dàng nhờ ViewBag:

<h1>@ViewBag.ProducTtitle</h1>
Price: @ViewBag.ProductPrice

Khác biệt chính ở đây là không kiểm tra thuộc tính khi dịch, và không có IntelliSense khi viết. Hay nói cách khác, bạn có thể sai chính tả một thuộc tính nào đó và bạn không biết cho tới khi bạn dùng View. Vậy nên bạn nên dung ViewData/viewBag cho lượng dữ liệu rất nhỏ. Tuy nhiên, bạn nên nhớ rằng bạn có thể tự do kết hợp ViewData/ViewBag với cách dùng View thông thường.

Sự khác biệt giữa ViewData và ViewBag?

Bạn sẽ thấy rằng tôi dùng hai khái niệm cho view động: thuộc tính ViewData và ViewBag. Chúng liên quan tới cùng một thứ, là Dictionary chứa key và value. Tuy nhiên, ViewBag là một đối tượng động, cho phép bạn có thể truy cập dữ liệu nếu chúng là thuộc tính của đối tượng ViewBag, thay vì coi như đầu vào của Dictionary. Bạn có thể dùng các thuộc tính kết hợp nhau, do chúng liên quan tới cùng dữ liệu, để tiện so sánh, ta xem vi dụ sau theo hai cách:

Controller:

public IActionResult DetailsViewData(int id){ ViewData["ProductTitle"] = "Toilet Paper"; ViewBag.ProductPrice = 1.99; return View();

}

View:

<h1>@ViewData["ProducTtitle"]</h1>
Price: @ViewBag.ProductPrice

Chú ý rằng cách dùng ViewData và như vậy theo phương pháp dựa vào Dictionary để đọc và viết ProductTitle, trong khi dùng cách truy cập vào đối tượng để có ProductPrice. Sự khác biệt không quá nhiều, ví dụ khả năng kiểm tra sự có mặt của cặp key/value trong ViewData (dùng phương thức ContainsKey()). Cuối cùng, bạn nên dùng phương pháp mà bạn thấy tiện dụng nhất và nên nhất quán.

Kết luận

Bạn có thể truyền dữ liệu từ Controller sang View bằng nhiều cách, nhưng nên dùng kiểu View. Bạn có thể tận dung IntelliSense và kiểm tra trong lúc biên dịch của các properties và methods mà bạn đang sử dụng.

This article has been fully translated into the following languages:

  • German
  • Hungarian
  • Italian
  • Spanish

Is your preferred language not on the list? Click here to help us translate this article into your language!