ASP.NET MVC - TempData - Thực hành tốt hoặc xấu


96

Tôi đang sử dụng AcceptVerbsphương pháp được nêu chi tiết trong bài đăng trên blog Xem trước 5 của Scott Gu để xử lý các mục nhập biểu mẫu trong ASP.NET MVC:

  • Người dùng nhận được một biểu mẫu trống thông qua GET
  • Người dùng đăng biểu mẫu đã điền qua ĐĂNG cho cùng một Hành động
  • Hành động xác thực dữ liệu, thực hiện hành động thích hợp và chuyển hướng đến chế độ xem mới

Vì vậy, tôi không phải sử dụng TempData. Điều đó nói rằng, bây giờ tôi phải thêm bước 'xác nhận' vào quy trình này và có vẻ như nó yêu cầu sử dụng TempData.

Vì lý do nào đó, tôi có ác cảm với việc sử dụng TempData- rằng nó là thứ cần được thiết kế xung quanh.

Đây có phải là một mối quan tâm hợp lệ hay tôi đang bịa ra?


1
Cân nhắc đặt bước 'xác nhận' của bạn thành hộp thoại javascript. Ít vòng tua máy chủ hơn và bạn sẽ không gặp phải sự cố này.
ajma 19/02/09

Câu trả lời:


26

Tôi nghĩ về dữ liệu tạm thời là một cơ chế ghi và quên để thông báo cho người dùng. Thật tuyệt khi cung cấp cho họ một lời nhắc nhở về điều gì đó họ đã làm gần đây, nhưng tôi cũng sẽ do dự khi đặt nó thành một bước bắt buộc trong một số quy trình của người dùng. Lý do là nếu họ làm mới trang, tôi tin rằng nó sẽ biến mất. Tôi đoán tôi cũng do dự khi sử dụng nó vì nó không thực sự được xác định rõ ràng về độ tin cậy của nó.

Tôi tự hỏi nếu vấn đề là bạn đang chuyển hướng hành động đến một trang khác trước bước xác nhận. Tôi tự hỏi liệu thay vào đó sau khi họ gửi lần đầu tiên, bạn có thể thực hiện đủ quá trình xử lý để tạo hộp thoại xác nhận, sau đó trả lại trang ban đầu với câu hỏi xác nhận hay không. Tương tự như cách bạn có thể thực hiện xác thực, ngoại trừ quy tắc xác thực kiểm tra xem bước xác nhận có được thực hiện hay không (với giao diện người dùng xác nhận bị ẩn cho đến khi quá trình xác thực khác vượt qua).


77

Không cần phải có ác cảm với TempData ... Nhưng nếu không được sử dụng đúng cách, nó chắc chắn có thể là một dấu hiệu của thiết kế kém. Nếu bạn đang sử dụng RESTful URL, TempData là phương pháp hay nhất để chuyển các thông báo từ Hành động POST sang Hành động GET của bạn. Xem xét điều này:

Bạn có một biểu mẫu tại URL Sản phẩm / Mới. Biểu mẫu Đăng lên Sản phẩm / Tạo, xác thực biểu mẫu và tạo Sản phẩm, Khi Thành công, Bộ điều khiển chuyển hướng đến URL Sản phẩm / 1 và nếu có lỗi sẽ chuyển hướng trở lại sản phẩm / Mới để hiển thị Thông báo Lỗi.

Products / 1 chỉ là hành động GET tiêu chuẩn cho sản phẩm, nhưng chúng tôi muốn một thông báo hiển thị cho biết việc chèn đã thành công. TempData là hoàn hảo cho việc này. Thêm thông báo vào TempData trong Bộ điều khiển bài đăng và đặt một số if logic trong chế độ xem và bạn đã hoàn thành.

Khi thất bại, tôi đã thêm các giá trị đã nhập trong formCollection và một tập hợp các Thông báo lỗi vào TempData trong Post Action, và chuyển hướng đến các Action Prodcuts / New. Tôi đã thêm logic vào dạng xem để điền các đầu vào biểu mẫu với các giá trị đã nhập trước đó cùng với bất kỳ thông báo lỗi nào. Có vẻ đẹp và sạch sẽ đối với tôi!


Tại sao phải làm thêm công việc đó khi bạn có thể đăng trực tiếp trở lại Products/New? Giá trị nào Products/Createthêm vào?
mpen

2
@Mark, sử dụng Sản phẩm / Tạo ngăn chặn tình huống người dùng hoàn thành hành động thông qua đăng lại, sau đó khi làm mới sau đó (hoặc đánh dấu & quay lại) vô tình hoàn thành hành động. Để biết thêm, hãy xem en.wikipedia.org/wiki/Post/Redirect/Get
ehdv

2
@ehdv: Nhưng có thật không? Khi thành công, nó chuyển hướng đến một trang khác, nếu thất bại, nó sẽ hiển thị các lỗi biểu mẫu và bạn không nên thực hiện hành động nào, vì vậy sẽ không gây hại gì. Nó sẽ chỉ ngăn chặn thông báo khó chịu "bạn có chắc chắn muốn đăng lại", mà tôi thường muốn. Tôi đoán nó phụ thuộc vào thiết kế của bạn, vì vậy tôi có thể thấy điểm của bạn.
mpen

31

Tôi nghĩ rằng bạn nên do dự trước khi sử dụng TempData. TempData được lưu trữ trong phiên và điều này có thể có ý nghĩa đối với bạn nếu:

  1. Bạn không sử dụng phiên trên trang web của mình ngay bây giờ
  2. Bạn có một hệ thống cần mở rộng quy mô đến thông lượng cao, tức là bạn muốn tránh hoàn toàn trạng thái phiên
  3. Bạn không muốn sử dụng cookie (tôi không biết MVC hỗ trợ các phiên không có nấu ăn ngay bây giờ tốt như thế nào)

Nếu trang web của bạn cần có tính khả dụng cao, thì có những cân nhắc bổ sung xung quanh việc áp dụng trạng thái phiên nhưng đây đều là những vấn đề có thể giải quyết được.


16
TempData không phải được lưu trữ trong phiên, mặc dù nó là trình cung cấp mặc định - đó có thể là lý do tại sao nó không có trong tài liệu phương thức. Ngoài ra còn có một nhà cung cấp cookie, như một ví dụ về cách viết một nhà cung cấp tùy chỉnh.
FinnNk

3

Tôi có một phương thức GetModel kiểm tra TempData ["model"] trước và trả về phương thức đó. Nếu không thì GetModel tải dữ liệu thích hợp từ cơ sở dữ liệu.

Nó tiết kiệm thêm tải từ cơ sở dữ liệu khi tôi có một hành động cần trả lại một dạng xem khác yêu cầu cùng một dữ liệu mô hình.


Yah, tôi đã gặp phải điều này: (1) xác thực một bản ghi tồn tại, nếu hợp lệ, hãy chuyển hướng đến trang (2) bản ghi tải để hiển thị cho người dùng. Vì vậy, cơ sở dữ liệu được đánh để xác nhận và hiển thị. Tôi gần như đang sử dụng TempData cho việc này, nhưng cảm thấy muốn kiểm tra ý kiến. Tôi thích phương pháp của bạn để chứa nó.
vô danh

Sẽ tốt hơn nếu sử dụng một cơ chế bộ nhớ đệm thích hợp trong trường hợp này.
nicodemus 13

3

Kiểm tra bộ điều khiển không phiên trong MVC3. Hóa ra, việc sử dụng phiên ngăn cản việc thực hiện song song các yêu cầu của một người dùng và do đó dẫn đến hiệu suất bị giảm sút.

Vì tempdata sử dụng phiên theo mặc định nên bạn sẽ không thể sử dụng tính năng này. Bạn có thể chuyển sang sử dụng cookie cho tempdata, nhưng nó hơi khó xử (ít nhất là đối với tôi). Tuy nhiên, vẫn sạch hơn so với viewstate, vì vậy có lẽ nó không phải là một công cụ phá vỡ vấn đề lớn như vậy.


2
Bạn nói đúng về Bộ điều khiển không phiên và TempData sử dụng Phiên. NHƯNG CHỜ! Phiên KHÔNG phải là một điều xấu và bạn có thể trộn và kết hợp Không phiên với các bộ điều khiển Phiên. Bạn thực sự muốn các bộ điều khiển Session_less_ khi bạn đang thực hiện nhiều lệnh gọi AJAX đến máy chủ (từ trình duyệt). Khi bạn chỉ cần nhấn một trang -at-a-time- .. bạn không cần phải mất phiên. Trên thực tế, điều đó KHÔNG mang lại cho bạn bất kỳ lợi ích nào ... bởi vì bạn chỉ đánh máy chủ MỘT LẦN. Vì vậy, nó có thể trộn và kết hợp.
Pure.Krome ngày

2

Tại sao bạn lại có ác cảm như vậy? Điều này chỉ đơn giản là làm cho công việc của nó và làm cho nó tốt :)

Nếu bạn không thích nó vì nó không được gõ mạnh, bạn luôn có thể tạo một trình bao bọc xung quanh để cung cấp cho bạn giao diện được gõ mạnh.


2

Nó giống như sử dụng ViewData, có nghĩa là nó có thể không phải là một rủi ro bảo mật. Nhưng tôi muốn sử dụng ViewData hơn là TempData. Kiểm tra tại đây để biết so sánh: http://www.squaredroot.com/2007/12/20/mvc-viewdata-vs-tempdata/

Tùy thuộc vào thiết kế, bạn luôn có thể lưu trữ người dùng / giỏ hàng hoặc bất kỳ thứ gì bạn cần trong dữ liệu tạm thời trong cơ sở dữ liệu và chỉ có trường "IsReady" cho biết liệu nó đã hoàn thành hay chưa, giúp nó có thể mở rộng để sử dụng sau này nếu bạn muốn sử dụng nhớ rằng mọi người có thể đóng trình duyệt của họ.


2
Lưu ý: bài viết bạn liên kết đến đã được cập nhật theo thời gian, nhưng chỉ chính xác cho MVC1. TempData đã thay đổi khá nhiều trong MVC2.
mikemanne 21/10/11

@mikemanne, vâng. Nhưng câu trả lời là từ cuối năm 2008. Nhưng có lẽ câu trả lời nên được cập nhật?
Filip Ekberg

0

Tất cả các câu trả lời tốt, bạn đã xem này để chuyển thông điệp cùng.

TempData và Session không phải là ý tưởng tốt nhất cho kiến ​​trúc RESTful vì hầu hết các phiên được lưu trữ trong bộ nhớ. Vì vậy, khi bạn muốn sử dụng một máy chủ, phiên người dùng sẽ tồn tại trên một máy chủ trong khi yêu cầu tiếp theo của họ có thể được gửi đến một máy chủ khác.

Điều đó đang được nói, hãy xem cách sử dụng TempData này để chuyển các thông điệp ở đây.

http://jameschambers.com/2014/06/day-14-bootstrap-alerts-and-mvc-framework-tempdata/

Mabye điều này có thể được điều chỉnh để sử dụng cách tiếp cận chuỗi truy vấn nếu chỉ được sử dụng để chuyển hướng đến cảnh báo trang khác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.