Viewbag'i Yönlendirmeden Önce Ayarla


122

Yeniden ViewBagyönlendirme aramadan önce ayarlamak mümkün mü ?

Ben şöyle bir şey istiyorum:

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

Yanıtlar:


242

Yeniden yönlendirmeyi kullandığınızda ViewBag, kullanmayacaksınız , ancakTempData

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
Görünümde değilseniz neden @ViewBag'iniz var?
apkisbossin

6
Cevabı tamamlamak istiyorum çünkü onu kullanıyorum ve küçük bir sorunla karşılaştım, yani TempData bir nedenden ötürü boş olduğunda (benim durumumda sadece bir dönüştürme yapıldığında bir mesajım var). Bu yüzden bir hatayı önlemek için if (TempData ["Message"]! = Null) testi yaptırmam gerekti.
Patrick

1
Ya yeniden yönlendirme diğer denetleyiciye yapılıyorsa? Diğer denetleyicinin ViewBag eyleminde, TempData ve Session boştur!
Andrew

1
@Andrew iyi, TempData belirli bir denetleyiciyle ilgili değil. Belki birden fazla yeniden yönlendirme yapıp TempData'yı kaybedersiniz? Yeni bir soruya bazı kodlarla bağlantı kurabilirsiniz ...
Raphaël Althaus

Bunları bir filtre özniteliğinin OnAuthorize yönteminde ayarlamaya çalışıyordum, ancak hiçbiri işe yaramadı, bu yüzden verileri iletmek için sorgu dizesini kullandım. Diğer taraftan, denetleyicideki TempData'yı ayarlamak, daha sonra bunu filtre özniteliğinde okumam gerektiğinde çalıştı. Teşekkürler!
Andrew

13

Bu durumda TempData'yı kullanabilirsiniz. İşte ViewBag, ViewData ve TempData için bazı açıklamalar.


8

Bunu beğendim ... ve benim için çalışıyor ... burada şifreyi değiştiriyorum ve başarı üzerine başarı mesajını görünümde görüntülemek için viewbag'e ayarlamak istiyorum ..

    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

Buradan alındı

özet

ViewData ve ViewBag nesneleri, modelinizle birlikte giden bu ekstra veri parçalarına erişmeniz için yollar sağlar, ancak daha karmaşık veriler için ViewModel'e geçebilirsiniz. Öte yandan TempData, özellikle HTTP yönlendirmelerinde verilerle çalışmak için tasarlanmıştır, bu nedenle TempData'yı kullanırken dikkatli olmayı unutmayın.


-2

Veya alternatif için Oturum kullanabilirsiniz:

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

ve sonra ihtiyaç duyduğunuzda arayın.

GÜNCELLEME

Ayrıca @James'in yorumunda söylediği gibi, istenmeyen önemsiz verilerden veya eski değerlerden kaçınmak için o belirli oturumun değerini kullandıktan sonra geçersiz kılmak veya temizlemek güvenli olacaktır.


4
Ben buna katılmıyorum. bunun için seans kullanmayın.
Mahmoodvcs

2
Bir alternatiftir. Bazı durumlarda tercih edilir.
csharpforevermore

Oturum değişkenleri, birkaç gönderi / alım arasında izlemeniz gereken şeyler için kullanışlıdır. Bunun gibi tek seferlik bir kullanım için, onu temizlemeyi hatırlamanız GEREKİR, yoksa daha sonra gereksiz veriler olur, bazı ekranda istenmeyen görünür veya hatta bağlam dışında mantığı tetikler.
James

@James Kesinlikle, bu yaklaşımı kullanmak için bazı durumlarda yaptığım şey bu. Kullanımdan sonra değerini geçersiz kılmak veya temizlemek bu gibi durumlarda bir zorunluluktur.
Jon P
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.