2013-04-11 59 views
6

Tôi có một liên kết trên một mạng lưới trong AdminUsers tôi xemRedirectToAction với thông báo lỗi

grid.Column(header: "", format: (item) => (condition ? Html.ActionLink("Impersonate", "Impersonate", "Admin", new { id = item.username }, null) : Html.Label("Impersonate"), style: "webgrid-column-link"), 

Trong bộ điều khiển, tôi có

public ActionResult Impersonate(string id) 
{ 
    string result = ORCA.utilities.users.setImpersonation(id); 
    if(result == "nocommonfields") 
     return RedirectToAction("AdminUsers", "Admin"); 
    else 
     return RedirectToAction("terms_of_use", "Forms"); 
} 

Làm thế nào có thể gửi một thông báo lỗi hiển thị khi tôi trở về trang AdminUsers?

Trả lời

23

Bạn có thể sử dụng TempData

if(result == "nocommonfields") 
{ 
    TempData["ErrorMessage"]="This is the message"; 
    return RedirectToAction("AdminUsers", "Admin"); 
} 

và trong hành động AdminUsers của bạn, bạn có thể đọc nó

public ActionResult AdminUsers() 
{ 
    var errMsg=TempData["ErrorMessage"] as string; 
//check errMsg value do whatever you want now as needed 
} 

Hãy nhớ rằng, TempData có rất ngắn cuộc sống span. Phiên là lưu trữ dự phòng phía sau dữ liệu tạm thời.

Hoặc, bạn cũng có thể xem xét việc gửi cờ trong chuỗi truy vấn và đọc nó trong phương thức hành động tiếp theo của mình và quyết định thông báo lỗi nào sẽ hiển thị.

+0

là nó có thể quay trở lại mặc định lỗi xác nhận với tempdata và hiển thị lỗi trong phần tử ValidationMessageFor? –

2

Thuộc tính điều khiển TempData có thể được sử dụng để đạt được loại chức năng này. Hạn chế chính của tôi trong quan điểm của tôi là nó sử dụng bộ nhớ phiên để lưu trữ nội dung của nó. Điều này có nghĩa là bạn sẽ có thêm công việc để nó hoạt động trên một trang trại hoặc bạn cần phải bật phiên ở nơi đầu tiên.

Điều tốt về TempData là chính xác những gì bạn muốn. Từ điển dựa trên chuỗi của nó và bạn có thể đặt bất kỳ thứ gì trong đó và theo mặc định, hãy lấy nó ra chỉ một lần. Vì vậy, trước khi gọi RedirectToAction() bạn đặt tin nhắn của mình. Trên yêu cầu tiếp theo bạn kiểm tra tin nhắn và hiển thị chúng. Bằng cách truy xuất thư, chúng sẽ tự động bị xóa ở cuối yêu cầu.

Thay vào đó, bạn có thể sử dụng cookie để truyền tải thông báo giữa hai yêu cầu. Về cơ bản, bạn có thể cuộn giải pháp của riêng mình hoặc triển khai ITempDataProvider tùy chỉnh để vận chuyển nội dung của TempData qua cookie. Lưu ý rằng bạn cần phải bảo mật cookie đúng cách. MachineKey.Protect() có thể giúp bạn nếu bạn đang lăn của riêng bạn.

Tôi đang đối mặt với cùng một vấn đề bạn đã làm và tạo giải pháp cho nó được gọi là FlashMessage. Có lẽ điều này có thể giúp bạn tiết kiệm một số công việc. Nó cũng có sẵn trên NuGet. Cách sử dụng rất đơn giản: bạn chỉ cần xếp hàng một thông điệp trước khi bạn gọi RedirectToAction() như sau:

if(result == "nocommonfields") 
{ 
    FlashMessage.Warning("Your error message"); 
    return RedirectToAction("AdminUsers", "Admin"); 
} 

Theo quan điểm của bạn, bạn bao gồm báo cáo kết quả sau đây để làm cho bất kỳ trước đây xếp hàng đợi thông điệp:

@Html.RenderFlashMessages() 
+0

Giải pháp tốt, một khả năng khác là gửi nó với chuỗi truy vấn (dĩ nhiên nếu nó không phải là dữ liệu nhạy cảm) .. Mặc dù nếu đó là dữ liệu nhạy cảm, tôi lại không chắc chắn về việc lưu trữ nó trong cookie (thậm chí được mã hóa bằng machineKey ..) Và kiểu suy nghĩ này khiến tôi sử dụng TempData mặc dù tôi ghét sử dụng nó :) Nhưng tên tiện ích của bạn là FlashMESSAGE và tôi đoán nó không có nghĩa là lưu trữ số thẻ tín dụng trong cookie lol – sotn

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