Setel Viewbag sebelum Redirect

122

Apakah mungkin untuk menyetel ViewBagsebelum saya memanggil pengalihan?

Saya ingin sesuatu seperti:

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

Jawaban:

242

Saat Anda menggunakan pengalihan, Anda tidak boleh menggunakan ViewBag, tapiTempData

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();
}
Raphaël Althaus
sumber
1
Mengapa Anda memiliki @ViewBag jika Anda tidak sedang dalam tampilan?
apkisbossin
6
Saya ingin melengkapi jawabannya karena saya sedang menggunakannya dan saya menghadapi masalah kecil yaitu ketika TempData kosong karena suatu alasan (dalam kasus saya saya hanya mendapat pesan saat konversi dilakukan). Jadi saya harus melakukan tes jika (TempData ["Message"]! = Null) untuk menghindari kesalahan.
Patrick
1
Bagaimana jika pengalihan ke pengontrol lain? Dalam aksi pengontrol lain ViewBag, TempData dan Session semuanya kosong!
Andrew
1
@ Andrew dengan baik, TempData tidak terkait dengan pengontrol tertentu. Mungkin Anda melakukan lebih dari satu pengalihan, dan kehilangan TempData? Anda dapat menautkan ke pertanyaan baru dengan beberapa kode ...
Raphaël Althaus
Saya mencoba mengaturnya di metiod OnAuthorize dari atribut filter, tetapi tidak ada yang berhasil, jadi saya akhirnya menggunakan string kueri untuk meneruskan data. Sebaliknya, pengaturan TempData di pengontrol berfungsi ketika saya nanti perlu membacanya di atribut filter. Terima kasih!
Andrew
13

Anda dapat menggunakan TempData dalam situasi ini. Berikut beberapa penjelasan untuk ViewBag, ViewData dan TempData.

laszlokiss88
sumber
8

Saya memang suka ini..dan berhasil untuk saya ... di sini saya mengubah kata sandi dan jika berhasil saya ingin menyetel pesan sukses ke viewbag untuk ditampilkan pada tampilan ..

    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);
    }
RAVI VAGHELA
sumber
3

Diambil dari sini

Ringkasan

Objek ViewData dan ViewBag memberi Anda cara untuk mengakses bagian data tambahan yang menyertai model Anda, namun untuk data yang lebih kompleks, Anda dapat naik ke ViewModel. TempData, di sisi lain, dirancang khusus untuk bekerja dengan data pada pengalihan HTTP, jadi ingatlah untuk berhati-hati saat menggunakan TempData.

Paul Zahra
sumber
-2

Atau Anda dapat menggunakan Sesi sebagai alternatif:

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

lalu panggil kapan pun Anda membutuhkannya.

MEMPERBARUI

Selain itu, seperti yang dikatakan @James dalam komentarnya, akan aman untuk membatalkan atau menghapus nilai sesi tertentu setelah Anda menggunakannya untuk menghindari data sampah yang tidak diinginkan atau nilai yang sudah ketinggalan zaman.

Jon P.
sumber
4
Saya tidak setuju dengan itu. jangan gunakan sesi untuk ini.
Mahmoodvcs
2
Ini ADALAH alternatif. Ini lebih disukai dalam situasi tertentu.
csharpforeverlebih lanjut
Variabel sesi berguna untuk hal-hal yang perlu Anda lacak di antara beberapa posting / dapatkan. Untuk penggunaan satu kali seperti ini, Anda HARUS ingat untuk menghapusnya, atau itu akan menjadi data sampah nanti, muncul tidak diinginkan di beberapa layar, atau bahkan memicu logika di luar konteks.
Yakobus
@ James Tepat, itulah yang saya lakukan untuk beberapa kasus, saya perlu menggunakan pendekatan ini. Menghapus atau menghapus nilainya setelah digunakan adalah suatu keharusan untuk kasus-kasus seperti ini.
Jon P