ViewBag, ViewData ve TempData


209

Herhangi bir vücut ne zaman kullanılacağını açıklayabilir mi

  1. TempData
  2. ViewBag
  3. Veriyi gör

Bir denetleyicide bir değer ayarlamam gereken bir gereksinimim var, bu denetleyici Denetleyici İki'ye yeniden yönlendirecek ve Denetleyici İki Görünümü oluşturacak.

ViewBag kullanmaya çalıştım, Kontrolör İki'ye ulaştığımda değer kayboluyor.

Ne zaman kullanılacağını ve avantaj veya dezavantajlarını bilebilir miyim?

Teşekkürler


5
Bu farklılıkları açıklayan harika bir gönderi.
Beku

1
stackoverflow.com/a/17199709/2015869
Imad Alazani

Yanıtlar:


293

1) TempData

Yönlendirme için hayatta kalacak verileri depolamanızı sağlar. Dahili olarak Oturumu destek deposu olarak kullanır, yönlendirme yapıldıktan sonra veriler otomatik olarak çıkarılır. Desen aşağıdaki gibidir:

public ActionResult Foo()
{
    // store something into the tempdata that will be available during a single redirect
    TempData["foo"] = "bar";

    // you should always redirect if you store something into TempData to
    // a controller action that will consume this data
    return RedirectToAction("bar");
}

public ActionResult Bar()
{
    var foo = TempData["foo"];
    ...
}

2) ViewBag, ViewData

Verileri, karşılık gelen görünümde kullanılacak bir denetleyici eyleminde depolamanızı sağlar. Bu, eylemin bir görünüm döndürdüğünü ve yönlendirmediğini varsayar. Sadece mevcut istek sırasında yaşıyor.

Desen aşağıdaki gibidir:

public ActionResult Foo()
{
    ViewBag.Foo = "bar";
    return View();
}

ve görünümde:

@ViewBag.Foo

veya ViewData ile:

public ActionResult Foo()
{
    ViewData["Foo"] = "bar";
    return View();
}

ve görünümde:

@ViewData["Foo"]

ViewBagyalnızca dinamik bir pakettir ViewDatave yalnızca ASP.NET MVC 3'te bulunur.

Bununla birlikte, bu iki yapının hiçbiri kullanılmamalıdır. Görünüm modellerini ve güçlü yazılan görünümleri kullanmalısınız. Böylece doğru desen aşağıdaki gibidir:

Modeli görüntüle:

public class MyViewModel
{
    public string Foo { get; set; }
}

Aksiyon:

public Action Foo()
{
    var model = new MyViewModel { Foo = "bar" };
    return View(model);
}

Güçlü yazım görünümü:

@model MyViewModel
@Model.Foo

Bu kısa tanıtımdan sonra sorunuza cevap verelim:

Benim gereksinimim, bir denetleyicide bir değer ayarlamak istiyorum, bu denetleyici ControllerTwo'ya yönlendirecek ve Controller2 Görünümü oluşturacaktır.

public class OneController: Controller
{
    public ActionResult Index()
    {
        TempData["foo"] = "bar";
        return RedirectToAction("index", "two");
    }
}

public class TwoController: Controller
{
    public ActionResult Index()
    {
        var model = new MyViewModel
        {
            Foo = TempData["foo"] as string
        };
        return View(model);
    }
}

ve ilgili görünüm ( ~/Views/Two/Index.cshtml):

@model MyViewModel
@Html.DisplayFor(x => x.Foo)

TempData kullanmanın dezavantajları vardır: kullanıcı hedef sayfada F5'e basarsa veriler kaybolur.

Şahsen ben TempData kullanmıyorum. Çünkü dahili olarak Session kullanıyor ve uygulamalarımdaki oturumu devre dışı bırakıyorum. Bunu başarmak için daha RESTful bir yol tercih ederim. Hangi: yönlendirmeyi gerçekleştiren ilk denetleyici eyleminde, nesneyi veri deponuzda depolayın ve yeniden yönlendirme sırasında oluşturulan benzersiz kimliği kullanın. Ardından hedef eylemde, başlangıçta depolanan nesneyi geri almak için bu kimliği kullanın:

public class OneController: Controller
{
    public ActionResult Index()
    {
        var id = Repository.SaveData("foo");
        return RedirectToAction("index", "two", new { id = id });
    }
}

public class TwoController: Controller
{
    public ActionResult Index(string id)
    {
        var model = new MyViewModel
        {
            Foo = Repository.GetData(id)
        };
        return View(model);
    }
}

Görünüm aynı kalır.


57
Harika bir cevap, ama dogmatik ifadesine katılmıyorum "bu iki yapının hiçbiri kullanılmamalıdır". ViewBag için birkaç meşru kullanım bulduk. Örneğin, ViewBag.Titletüm görünümlerimde _Layout.cshtmltemel görünüm dosyamda kullanılan bir özellik ayarladım . Kullandığım başka bir durum da kullanıcılara bilgi mesajları (örn. "Ürün başarıyla kaydedildi!") Vermektir. Layout.cshtmlİletilirse bir ileti oluşturmak için bazı genel işaretlemeler yerleştirdim ve bu, ViewBag.Messageherhangi bir Eylemde ayarlamama izin veriyor . Her iki durum için bir ViewModel özelliği kullanmanın çok fazla dezavantajı vardır.
Jesse Webb

22
Jesse ile anlaşmak zorundayım, bu mükemmel bir açıklama olsa da, açık bir şekilde ViewBag'i kullanmak için iyi bir neden olmadığını belirten bir görüş meselesi, aslında bir mesele değil. ViewBag'i aşırı kullanmak kesinlikle kötü bir uygulamadır ve bazı geliştiriciler bu tuzağa düşer, ancak zevkle kullanılır, güçlü bir kaynaktır.
Ron DeFreitas

1
@ ron.defreitas, tamam, bana neden kullanman için iyi bir neden söyle ViewBag. Lütfen ViewBag'in bir kullanımı olduğunda belirli, gerçek bir dünya senaryosunu tanımlayın. Ne olduğunu söylüyorsunuz, ben alıntı güçlü bir kaynak , bunu bazı özel durumlarda var sanırım güçlü bir kaynaktır olan güçlü . Kariyerimde hiç kullanmadığımdan, insanların bu güçlü silahı nasıl kullandıklarını öğrenmekten çok mutlu olurum .
Darin Dimitrov

27
Burada bir seçkincimiz var. Darin, Jesse özellikle böyle bir örnekten bahsetti. Her zaman bir şeyler yapmanın başka yolları olduğu için, yararlılıklarını otomatik olarak reddetmezler.
Djentleman

2
@DarinDimitrov: Şu anda bir öznitelik yöntemi içinden görünüme bazı bilgileri iletmem gereken bir senaryom var. FilterContext.Controller.ViewData kullanmak, güçlü bir şekilde yazılmış bir görünüme geçirmeye çalışmaktan çok daha kolaydır. Bununla birlikte, açıklamanız için teşekkür ederim, çok faydalı oldu.
Andy

15

ASP.NET MVC bize denetleyiciden görüntülemek ve sonraki istekte veri geçirmek için üç seçenek ViewData, ViewBag ve TempData sunar. ViewData ve ViewBag neredeyse benzerdir ve TempData ek sorumluluk üstlenir. Bu üç nesneyi tartışalım veya kilit noktaları ele alalım:

ViewBag ve ViewData arasındaki benzerlikler:

  • Denetleyiciden görünüme geçtiğinizde verilerin korunmasına yardımcı olur.
  • Verileri denetleyiciden karşılık gelen görünüme geçirmek için kullanılır.
  • Kısa ömür, yönlendirme gerçekleştiğinde değerin boş kaldığı anlamına gelir. Çünkü hedefleri kontrolörler ve görüşler arasında iletişim kurmak için bir yol sağlamaktır. Sunucu çağrısı içindeki bir iletişim mekanizmasıdır.

ViewBag ve ViewData arasındaki fark:

  • ViewData, ViewDataDictionary sınıfından türetilmiş ve anahtarlar olarak dizeler kullanılarak erişilebilen nesnelerin sözlüğüdür.
  • ViewBag, C # 4.0'daki yeni dinamik özelliklerden yararlanan dinamik bir özelliktir.
  • ViewData karmaşık veri türü için yazım gerektirir ve hatayı önlemek için null değerleri kontrol edin.
  • ViewBag, karmaşık veri türü için yazım gerektirmez.

ViewBag & ViewData Örneği:

public ActionResult Index()
{
    ViewBag.Name = "Monjurul Habib";
    return View();
}


public ActionResult Index()
{
    ViewData["Name"] = "Monjurul Habib";
    return View();
} 

Görünümünde:

@ViewBag.Name 
@ViewData["Name"] 

TempData:

TempData ayrıca TempDataDictionary sınıfından türetilmiş ve kısa ömürlü oturumda depolanan ve bir dize anahtar ve nesne değeridir. Fark, nesnenin yaşam döngüsünün olmasıdır. TempData bilgileri bir HTTP İsteği için saklar. Bu sadece bir sayfadan diğerine anlamına gelir. Bu aynı HTTP İsteğinde olduğu için 302/303 yönlendirmesiyle de çalışır. Bir denetleyiciden diğer denetleyiciye veya bir eylemden diğer eyleme geçtiğinizde verilerin korunmasına yardımcı olur. Başka bir deyişle, yönlendirme yaptığınızda, “TempData” bu yönlendirmeler arasındaki verilerin korunmasına yardımcı olur. Dahili olarak oturum değişkenleri kullanır. Geçerli ve sonraki istek sırasında geçici veri kullanımı, yalnızca bir sonraki isteğin bir sonraki görünüme yönlendireceğinden emin olduğunuzda kullanıldığı anlamına gelir. Karmaşık veri türü için yazım gerektirir ve hatayı önlemek için null değerleri kontrol edin.

public ActionResult Index()
{
  var model = new Review()
            {
                Body = "Start",
                Rating=5
            };
    TempData["ModelName"] = model;
    return RedirectToAction("About");
}

public ActionResult About()
{
    var model= TempData["ModelName"];
    return View(model);
}

Son mekanizma, ViewData gibi çalışan ve anahtar için bir dize ve değer için nesne alan bir Sözlük gibi çalışan Oturum'dur. Bu, istemci Çerezi içinde saklanır ve çok daha uzun süre kullanılabilir. Ayrıca hiçbir zaman gizli bilgiye sahip olamayacağınız için daha fazla doğrulama gerekir. ViewData veya ViewBag ile ilgili olarak, uygulama performansı için akıllıca kullanmalısınız. Çünkü her eylem düzenli asp.net mvc isteğinin tüm yaşam döngüsü boyunca geçer. ViewData / ViewBag öğesini alt eyleminizde kullanabilirsiniz, ancak denetleyicinizi kirletebilecek ilgisiz verileri doldurmak için kullanmamaya dikkat edin.


11

TempData

Temelde bir DataReader gibidir, okunduktan sonra veriler kaybolur.

Bu Videoyu Kontrol Et

Misal

public class HomeController : Controller
{
    public ActionResult Index()
    {
        ViewBag.Message = "Welcome to ASP.NET MVC!";
        TempData["T"] = "T";
        return RedirectToAction("About");
    }

    public ActionResult About()
    {
        return RedirectToAction("Test1");
    }

    public ActionResult Test1()
    {
        String str = TempData["T"]; //Output - T
        return View();
    }
}

Yukarıdaki koda dikkat ederseniz, TempData okunana kadar RedirectToAction'ın TempData üzerinde hiçbir etkisi yoktur. Bu nedenle, TempData okunduğunda değerler kaybolur.

TempData'yı okuduktan sonra nasıl saklayabilirim?

Eylem Yöntemi Test 1 ve Test 2'deki çıkışı kontrol edin

public class HomeController : Controller
{
    public ActionResult Index()
    {
        ViewBag.Message = "Welcome to ASP.NET MVC!";
        TempData["T"] = "T";
        return RedirectToAction("About");
    }

    public ActionResult About()
    {
        return RedirectToAction("Test1");
    }

    public ActionResult Test1()
    {
        string Str = Convert.ToString(TempData["T"]);
        TempData.Keep(); // Keep TempData
        return RedirectToAction("Test2");
    }

    public ActionResult Test2()
    {
        string Str = Convert.ToString(TempData["T"]); //OutPut - T
        return View();
    }
}

Yukarıdaki koda dikkat ederseniz, RedirectToAction'dan sonra ve Verileri Okuduktan sonra veriler kaybolmaz ve nedeni, kullanıyoruz TempData.Keep(). bu mu

Bu şekilde, diğer kontrol cihazlarında da istediğiniz kadar devam ettirebilirsiniz.

ViewBag / ViewData

Veriler karşılık gelen Görünüme devam edecektir


4

Asp.Net MVC TempData çok kullanışlı özelliklerinden biridir. Mevcut istekten sonraki isteğe veri iletmek için kullanılır. Başka bir deyişle, yeniden yönlendirme yapılırken bir sayfadan başka bir sayfaya veri göndermek istiyorsak TempData'yı kullanabiliriz, ancak MVC'de bu özelliğe ulaşmak için kodda biraz düşünmemiz gerekir. TempData ömrü çok kısadır ve sadece hedef görünüm tamamen yüklenene kadar yatar. Ancak, TempData'da verileri sürdürmek için Keep () yöntemini kullanabiliriz.

Daha fazla oku


3

MVC'de ViewBag, ViewData, TempData ve View State

http://royalarun.blogspot.in/2013/08/viewbag-viewdata-tempdata-and-view.html

ASP.NET MVC bize denetleyiciden görüntülemek ve sonraki istekte veri geçirmek için üç seçenek ViewData, VieBag ve TempData sunuyor. ViewData ve ViewBag neredeyse benzerdir ve TempData ek sorumluluk üstlenir.

ViewBag ve ViewData arasındaki benzerlikler:

Denetleyiciden görünüme geçtiğinizde verilerin korunmasına yardımcı olur. Verileri denetleyiciden karşılık gelen görünüme geçirmek için kullanılır. Kısa ömür, yönlendirme gerçekleştiğinde değerin boş kaldığı anlamına gelir. Çünkü hedefleri kontrolörler ve görüşler arasında iletişim kurmak için bir yol sağlamaktır. Sunucu çağrısı içindeki bir iletişim mekanizmasıdır.

ViewBag ve ViewData arasındaki fark:

ViewData, ViewDataDictionary sınıfından türetilmiş ve anahtarlar olarak dizeler kullanılarak erişilebilen nesnelerin sözlüğüdür. ViewBag, C # 4.0'daki yeni dinamik özelliklerden yararlanan dinamik bir özelliktir. ViewData karmaşık veri türü için yazım gerektirir ve hatayı önlemek için null değerleri kontrol edin. ViewBag, karmaşık veri türü için yazım gerektirmez.

ViewBag & ViewData Örneği:

public ActionResult Index()

{  
    ViewBag.Name = "Arun Prakash";
    return View();    
}

public ActionResult Index()  
{
    ViewData["Name"] = "Arun Prakash";
    return View(); 
}

View'da aşağıdaki gibi arama yapıyoruz:

@ViewBag.Name   
@ViewData["Name"]

TempData:

Bir denetleyiciden diğer denetleyiciye veya bir eylemden diğer eyleme geçtiğinizde verilerin korunmasına yardımcı olur. Başka bir deyişle, yönlendirme yaptığınızda, “Tempdata” bu yönlendirmeler arasındaki verilerin korunmasına yardımcı olur. Dahili olarak oturum değişkenleri kullanır. TempData çok kısa ömürlü bir örnektir ve yalnızca geçerli ve sonraki isteklerde kullanmalısınız

TempData kullanmanın güvenilir bir şekilde çalışacağı tek senaryo, yeniden yönlendirdiğiniz zamandır. Bunun nedeni, bir yönlendirmenin geçerli isteği öldürmesi (ve istemciye Taşınan HTTP durum kodu 302 Nesnesi göndermesi), daha sonra yeniden yönlendirilen görünümü sunmak için sunucuda yeni bir istek oluşturmasıdır.

Karmaşık veri türü için yazım gerektirir ve hatayı önlemek için null değerleri kontrol edin.

public ActionResult Index()
{   
   var model = new Review()  
   {  
      Body = "Start",  
      Rating=5  
   };  

    TempData["ModelName"] = model;    
    return RedirectToAction("About");   
} 

public ActionResult About()       
{  
    var model= TempData["ModelName"];  
    return View(model);   
}  

1
void Keep()

Calling this method with in the current action ensures that all the items in TempData are not removed at the end of the current request.

    @model MyProject.Models.EmpModel;
    @{
    Layout = "~/Views/Shared/_Layout.cshtml";
    ViewBag.Title = "About";
    var tempDataEmployeet = TempData["emp"] as Employee; //need typcasting
    TempData.Keep(); // retains all strings values
    } 

void Keep(string key)

Calling this method with in the current action ensures that specific item in TempData is not removed at the end of the current request.

    @model MyProject.Models.EmpModel;
    @{
    Layout = "~/Views/Shared/_Layout.cshtml";
    ViewBag.Title = "About";
    var tempDataEmployeet = TempData["emp"] as Employee; //need typcasting
    TempData.Keep("emp"); // retains only "emp" string values
    } 

1

TempData ilk okumaya kadar her zaman kullanılabilir olacak, okuduktan sonra artık mevcut değil ilk okumadan sonra gidecek görüntülemek için de hızlı mesaj geçmek için yararlı olabilir. ViewBag Daha hızlı bir şekilde veri parçasını görünüme geçirirken daha kullanışlıdır, normalde tüm verileri görünüme model aracılığıyla geçirmelisiniz, ancak modelden doğrudan gelen varlık çerçevesi gibi veritabanına eşlenen bir model oluşturduğunuz durumlarda, Eğer yeni bir veri parçası geçmek için modelinizi değiştirmek için ne, bu Viewbag ViewData sadece endeksli sürümü ve MVC3 önce kullanılan viewbag içine yapıştırabilirsiniz


0

Ayrıca kapsam viewbag ve temptdata arasında farklıdır. viewbag ilk görünüme dayanır (eylem yöntemleri arasında paylaşılmaz) ancak temptdata bir eylem yöntemi ile yalnızca birbiri arasında paylaşılabilir.

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.