-3

ASP.NET MVC Tip #6 – Call RedirectToAction sau khi Submitting Form

Trong thủ thuật này, tôi giải thích lý do tại sao bạn nên gọi phương thức RedirectToAction () sau khi submitting form thay vì trả lại một view.

Hãy tưởng tượng rằng bạn đang thu thập thông tin từ người sử dụng trang web của bạn với một hình thức HTML. Dạng HTML được hiển thị bằng một controller action tên HomeController.Create() và các dữ liệu mẫu được gửi đến một controller action tên HomeController.New() để thêm vào cơ sở dữ liệu. Sau khi form dữ liệu được gửi, bạn muốn hiển thị các kết quả khảo sát tích lũy (xem hình 1).

Hình 1 - Results.aspx View

alt

Có hai phương pháp mà bạn có thể làm để viết một controller action mới. Trong Liệt kê 1, action New() đầu tiên nộp dữ liệu form đến cơ sở dữ liệu (sử dụng LINQ to SQL) và sau đó gọi RedirectToAction () để chuyển hướng người dùng đến action Results(). Trong Liệt kê 2, action New() không gọi RedirectToAction(). Thay vào đó, view Results.aspx được trả trực tiếp bởi action New().

Liệt kê 1 - SurveyController.vb

Public Class SurveyController
    Inherits System.Web.Mvc.Controller
 
    Private _db As New SurveyDataContext()
 
    Function Create()
        Return View()
    End Function
 
    Function [New](ByVal favoriteColor As String)
 
        ' Add new survey results to database
        Dim newSurvey As New Survey()
        newSurvey.FavoriteColor = favoriteColor
        newSurvey.EntryDate = DateTime.Now
        _db.Surveys.InsertOnSubmit(newSurvey)
        _db.SubmitChanges()
 
        ' Redirect to Confirm action
        Return RedirectToAction("Results")
    End Function
 
    Function Results()
        Return View(_db.Surveys)
    End Function
 
End Class

Listing 2 – Survey2Controller.vb

Public Class Survey2Controller
    Inherits System.Web.Mvc.Controller
 
    Private _db As New SurveyDataContext()
 
    Function Create()
        Return View()
    End Function
 
    Function [New](ByVal favoriteColor As String)
 
        ' Add new survey results to database
        Dim newSurvey As New Survey()
        newSurvey.FavoriteColor = favoriteColor
        newSurvey.EntryDate = DateTime.Now
        _db.Surveys.InsertOnSubmit(newSurvey)
        _db.SubmitChanges()
 
        ' Return Results view
        Return View("Results", _db.Surveys)
    End Function
 
End Class

Vì vậy, có hai cách tiếp cận khác nhau để thể hiện một trang kết quả sau khi submitting form data. Bạn có thể trả về RedirectToAction() hoặc bạn có thể trả về View(). Những cách tiếp cận tốt hơn?

Khi bạn gọi RedirectToAction(), framework ASP.NET MVC nhờ trình duyệt web để thực hiện một yêu cầu mới đến trang web của bạn. Phương pháp RedirectToAction() trả về 302 - Tình trạng Moved Object cho trình duyệt. Trình duyệt này fetches Results view.

Vì vậy, bạn có thể nghĩ gọi RedirectToAction() là chiến lược nghèo. Trình duyệt đã làm việc hơn khi bạn gọi RedirectToAction (). Một cái gì đó có thể đi sai trên mạng khi trình duyệt tạo ra một yêu cầu mới. Sử dụng RedirectToAction () mở ra nhiều khả năng một điều gì đó đang xảy ra sai.

Tuy nhiên, có ba lý do chính đáng để thích RedirectToAction () qua việc quay lại view trực tiếp: hai lý do được thực tế và một lý do là triết học. Hãy bắt đầu với những lý do thực tế. Nếu bạn không chuyển hướng, và người dùng chạm vào nút refresh / reload trong trình duyệt, dữ liệu cơ sở dữ liệu được gửi nhiều hơn một lần. Nói cách khác, nếu bạn không chuyển hướng, bạn có thể nhận được dữ liệu cơ sở dữ liệu trùng lặp trong bảng cơ sở dữ liệu của bạn.

Bây giờ, đó là sự thật mà các trình duyệt hiện đại cảnh báo người dùng về nguy cơ này. Microsoft Internet Explorer 7.0 cung cấp các cảnh báo độc đáo worded trong hình 2. Vì vậy, có lẽ nguy hiểm này không phải là khá là xấu như nó được trong quá khứ.

Hình 2 - IE cảnh báo khi làm mới sau khi post form

alt

Lý do thực tế thứ hai có liên quan đến đầu tiên. Nếu bạn đánh dấu các trang kết quả (hoặc gửi email cho một liên kết đến trang đến một người bạn) và sử dụng các bookmark để mở trang sau, các hoạt động cơ sở dữ liệu sẽ xảy ra mà không báo trước. Form này sẽ được submitted không có dữ liệu, client-side validate sẽ được bỏ qua, và bạn sẽ nhận được trang xấu xí trong hình 2:

Hình 2 - Trả về kết quả bookmark

alt

Lý do thứ ba để thích RedirectToAction () trên View () là triết học. framework ASP.NET MVC cung cấp một “RESTful” giao diện đến ứng dụng của bạn. URL khác nhau tương ứng với hành động khác nhau. Nếu bạn trả lại Results view khi action New() được gọi, sự tương ứng giữa actions và views bị phá vỡ. Nói cách khác, trong một ứng dụng RESTful, view mà bạn nhìn thấy phải tương ứng với URL mà bạn nhìn thấy trong thanh địa chỉ của trình duyệt.

Nếu bạn gọi RedirectToAction () sau khi submit các dữ liệu form, bạn sẽ thấy Survey/Results trong thanh địa chỉ của trình duyệt. Nếu bạn gọi View () sau khi submit các dữ liệu form, bạn sẽ thấy Survey/New trong thanh địa chỉ của trình duyệt. Bởi vì bạn đang xem trang Results, kịch bản đầu tiên có ý nghĩa hơn. Thanh địa chỉ trình duyệt nên phản ánh tình trạng của ứng dụng web. Làm một chuyển hướng cho phép bạn giữ cho trình duyệt và máy chủ đồng bộ.

Nếu bạn muốn thử nghiệm với hai phương pháp submit form được thảo luận trong mẹo này, nhấp vào liên kết sau để tải về mã. https://aspblogs.blob.core.windows.net/media/stephenwalther/Downloads/Tip6/Tip6.zip

Nguồn: https://weblogs.asp.net/stephenwalther/asp-net-mvc-tip-6-call-redirecttoaction-after-submitting-a-form


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.