2012-11-24 63 views
19

Tôi có yêu cầu hiển thị thông báo xác nhận cập nhật cơ sở dữ liệu thành công trong ứng dụng ASP.NET MVC. Hiện tại, ứng dụng chỉ hiển thị các thông báo (sử dụng trình trợ giúp ValidationSummary) khi xảy ra lỗi. Trên một hoạt động thành công, ứng dụng hiện đang chuyển hướng đến một điểm phù hợp trong điều hướng.ASP.NET MVC: Cách hiển thị thông báo xác nhận thành công sau khi xử lý phía máy chủ

Mục tiêu là:

  • hiển thị thông báo xác nhận một cách thích hợp
  • Minimize hành động người dùng cần thiết để tiến hành sau khi đọc thông điệp
  • Tránh thêm bài/khứ hồi để hiển thị thông điệp
  • Giảm thiểu nỗ lực phát triển và rủi ro khi chèn tin nhắn tại nhiều điểm trong ứng dụng

Tùy chọn của tôi sẽ là một dạng hiển thị thông báo kiểu công cụ-tip gần nút gửi và sau đó là cơ chế để xóa thư và tiếp tục với chuyển hướng hiện có sau khi thành công.

Điều đó dường như đề xuất cuộc gọi Ajax thay vì HTTP POST hiện có để gửi biểu mẫu. Làm thế nào tôi sẽ đi về điều này?

Trả lời

35

Tôi sẽ sử dụng TempData["key"]

này giống như ViewData["key"] tuy nhiên các dữ liệu vẫn tồn tại cho tới HttpRequest và được tự động xử lý bởi asp.net sau

Vì vậy, bạn có thể thực hiện việc này.

điều khiển hành động

[HttpPost] 
public ActionResult SomePostAction(SomeViewModel vm) 
{ 
    if(ModelState.IsValid) // Is User Input Valid? 
    { 
     try 
     { 
      CommitData(); 
      TempData["UserMessage"] = new MessageVM() { CssClassName = "alert-sucess", Title = "Success!", Message = "Operation Done." }; 
      return RedirectToAction("Success"); 
     } 
     catch(Exception e) 
     { 
      TempData["UserMessage"] = new MessageVM() { CssClassName = "alert-error", Title = "Error!", Message = "Operation Failed." }; 
      return RedirectToAction("Error"); 
     } 

    } 

    return View(vm); // Return View Model with model state errors 
} 

_Layout.cshtml

<!DOCTYPE html> 
    <html> 
    <head> 

    </head> 
    <body> 
     @if(TempData["UserMessage"] != null) 
     { 
      var message = (MessageVM)TempData["UserMessage"]; 
      <div class="alert @message.CssClassName"> 
       <strong>@message.Title</strong> 
       @message.Message 
      </div> 
     } 
      @RenderBody() 
    </body> 
</html> 

More Info: http://www.devcurry.com/2012/05/what-is-aspnet-mvc-tempdata.html

+0

Tôi thích điều này vì nó cho tôi tùy chọn hiển thị thông báo trên trang mà tôi chuyển hướng sau khi cập nhật thành công. Nếu tôi thực hiện phương pháp này, một tùy chọn sẽ hiển thị thông báo trong bảng điều khiển loại công cụ tự động biến mất sau một thời gian định trước, không yêu cầu thêm hành động người dùng nào. Nó cũng có tác động thấp về việc tái cấu trúc được yêu cầu. Cảm ơn! –

+0

Tôi thích câu trả lời của bạn, mối quan tâm duy nhất của tôi là chuyển hướng đến lỗi. Điều này sau đó sẽ ngăn người dùng gửi lại bài đăng của họ. Hoặc có lẽ đó là ý tưởng? Thành công chắc chắn, dừng phản hồi trùng lặp, nhưng lỗi có thể yêu cầu gửi lại. – Tod

+0

Hi @Tod Tôi thấy điểm của bạn tuy nhiên tôi nghĩ rằng mối quan tâm của bạn là nhiều hơn để làm với xác nhận dữ liệu. Nếu có vấn đề với dữ liệu do người dùng gửi thì điều này sẽ được xử lý bằng cách sử dụng 'ModelState.IsValid' và sau đó bạn có thể' return View (vm) 'tôi sẽ cập nhật câu trả lời của mình để rõ ràng hơn một chút. – SimonGates

9

Trên một hoạt động thành công, bạn chỉ cần lưu trữ các mô tả thông báo thành công vào ViewBag giống như

ViewBag.successMessage="Success" 

thì trong chế độ xem, hãy kiểm tra ViewB giá trị ag là null hay không? thông qua javascript, nếu chương trình không phải là null tin nhắn trong Div

if('@ViewBag.successMessage'!="") 
{ 
    $('#divSuccessMessage').show(); 
} 
else 
{ 
    $('#divSuccessMessage').hide(); 
} 

mặc định trong tải trang ẩn div

+0

Cảm ơn, tôi bây giờ nhìn thấy nó đơn giản hơn tôi nghĩ. Để quản lý việc chuyển hướng đến một trang khác sau khi hiển thị thông báo thành công, tôi đoán tôi có thể thêm một trình xử lý onclick vào div tin nhắn. –

Các vấn đề liên quan