Đặt Viewbag trước Redirect


122

Có thể thiết lập ViewBagtrước khi tôi gọi chuyển hướng không?

Tôi muốn một cái gì đó như:

@ViewBag.Message="MyMessage";
RedirectToAction("MyAction");

Câu trả lời:


242

Khi bạn sử dụng chuyển hướng, bạn sẽ không sử dụng ViewBag, nhưngTempData

public ActionResult Action1 () {
 TempData["shortMessage"] = "MyMessage";
 return RedirectToAction("Action2");
}

public ActionResult Action2 () {
 //now I can populate my ViewBag (if I want to) with the TempData["shortMessage"] content
  ViewBag.Message = TempData["shortMessage"].ToString();
  return View();
}

1
Tại sao bạn có @ViewBag nếu bạn không ở trong chế độ xem?
apkisbossin

6
Tôi muốn hoàn thành câu trả lời vì tôi đang sử dụng nó và tôi gặp phải một vấn đề nhỏ đó là khi TempData bị trống vì lý do nào đó (trong trường hợp của tôi, tôi chỉ có thông báo khi thực hiện chuyển đổi). Vì vậy, tôi đã phải kiểm tra if (TempData ["Message"]! = Null) để tránh lỗi.
Patrick

1
Điều gì sẽ xảy ra nếu chuyển hướng đến bộ điều khiển khác? Trong action của controller khác ViewBag, TempData và Session đều trống!
Andrew

1
@Andrew tốt, TempData không liên quan đến một bộ điều khiển cụ thể. Có thể bạn thực hiện nhiều hơn một lần chuyển hướng và mất TempData? Bạn có thể liên kết đến một câu hỏi mới với một số mã ...
Raphaël Althaus.

Tôi đã cố gắng đặt những cái đó trong metiod OnAuthorize của thuộc tính bộ lọc, nhưng không có tác dụng nào, vì vậy tôi đã kết thúc bằng cách sử dụng chuỗi truy vấn để chuyển dữ liệu. Ngược lại, đặt TempData trong bộ điều khiển đã hoạt động khi sau này tôi cần đọc nó trong thuộc tính bộ lọc. Cảm ơn!
Andrew

13

Bạn có thể sử dụng TempData trong tình huống này. Dưới đây là một số giải thích cho ViewBag, ViewData và TempData.


8

Tôi đã làm như thế này..và nó đang hoạt động cho tôi ... ở đây tôi đang thay đổi mật khẩu và khi thành công, tôi muốn đặt thông báo thành công cho viewbag để hiển thị trên màn hình ..

    public ActionResult ChangePass()
    {
        ChangePassword CP = new ChangePassword();
        if (TempData["status"] != null)
        {
            ViewBag.Status = "Success";
            TempData.Remove("status");
        }
        return View(CP);
    }

    [HttpPost]
    public ActionResult ChangePass(ChangePassword obj)
    {
        if (ModelState.IsValid)
        {
            int pid = Session.GetDataFromSession<int>("ssnPersonnelID");
            PersonnelMaster PM = db.PersonnelMasters.SingleOrDefault(x => x.PersonnelID == pid);

            PM.Password = obj.NewPassword;
            PM.Mdate = DateTime.Now;
            db.SaveChanges();

            TempData["status"] = "Success";
            return RedirectToAction("ChangePass");
        }

        return View(obj);
    }

3

Lấy từ đây

Tóm lược

Các đối tượng ViewData và ViewBag cung cấp cho bạn các cách để truy cập những phần dữ liệu bổ sung đi cùng với mô hình của bạn, tuy nhiên đối với những dữ liệu phức tạp hơn, bạn có thể chuyển lên ViewModel. Mặt khác, TempData được thiết kế đặc biệt để làm việc với dữ liệu trên các chuyển hướng HTTP, vì vậy hãy nhớ thận trọng khi sử dụng TempData.


-2

Hoặc bạn có thể sử dụng Session để thay thế:

Session["message"] = "MyMessage";
RedirectToAction("MyAction");

và sau đó gọi nó bất cứ khi nào bạn cần.

CẬP NHẬT

Ngoài ra, như những gì @James đã nói trong nhận xét của mình, sẽ an toàn nếu bạn vô hiệu hóa hoặc xóa giá trị của phiên cụ thể đó sau khi bạn sử dụng nó để tránh dữ liệu rác không mong muốn hoặc giá trị lỗi thời.


4
Tôi không đồng ý về điều đó. không sử dụng phiên cho việc này.
Mahmoodvcs

2
Nó là một sự thay thế. Nó được ưu tiên trong một số tình huống nhất định.
csharpforevermore

Các biến phiên hữu ích cho những thứ mà bạn cần theo dõi giữa một số bài đăng / lượt nhận. Đối với việc sử dụng một lần như thế này, bạn phải nhớ xóa nó, nếu không nó sẽ là dữ liệu rác sau này, xuất hiện không mong muốn trên một số màn hình hoặc thậm chí kích hoạt logic ngoài ngữ cảnh.
James

@James Chính xác, đó là những gì tôi làm đối với một số trường hợp tôi cần sử dụng cách tiếp cận này. Vô hiệu hóa hoặc xóa giá trị của nó sau khi sử dụng là điều bắt buộc đối với những trường hợp như thế này.
Jon P
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.