SORU
3 Kasım 2011, PERŞEMBE


ViewBag, ViewData ve TempData

Herhangi bir vücut olduğunu açıklayabilir

  1. TempData
  2. ViewBag
  3. ViewData

Bir denetleyici içinde bir değer ayarlamak için gereken bir şartı var, o denetleyici Denetleyici İki yönlendirir ve Denetleyici İki Görünüm verecek.

ViewBag kullanmak için denedim, değer Denetleyicisi İki ulaşmak zaman kaybolmaz.

Zaman ve avantaj ve dezavantajları nelerdir?

Teşekkürler

CEVAP
3 Kasım 2011, PERŞEMBE


1)TempData

Seni yönlendirmek için sağ kalmayacak veri depolamak için izin verir. Pişirme deposu olarak Oturum DAHİLİ olarak kullanır, yönlendirme yapıldıktan sonra veriler otomatik olarak tahliye edilir. Desen şudur:

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

İlgili görünümde kullanılacak denetleyici bir eylem içinde veri depolamak için izin verir. Bu eylem bir görünüm verir ve yönlendirme olmadığını varsayar. Yalnızca geçerli istek sırasında yaşıyor.

Desen şudur:

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

ve görünümü:

@ViewBag.Foo

ya ViewData:

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

ve görünümü:

@ViewData["Foo"]

ViewBag ViewData sadece dinamik bir sarıcı ve ASP.NET MVC 3 var.

Bu varlık bu iki yapıları hiçbiri kullanılması gerektiğini söyledi. Görünüm modelleri ve türü kesin belirlenmiş görünümleri kullanmanız gerekir. Doğru desen şudur:

Görünümü model:

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

Eylem:

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

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

@model MyViewModel
@Model.Foo

Bu kısa girişten sonra hadi Sorunuzun cevabı:

Benim gereksinimi bir denetleyici içinde bir değer, bunu ayarlamak istiyorum. denetleyicisi ControllerTwo ve Controller2 olacaktır işlemek için yönlendirir Görünüm.

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 karşılık gelen görünüm (~/Views/Two/Index.cshtml):

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

Eğer kullanıcı verileri kaybedilir hedef sayfayı F5 isabet ederse. de TempData kullanmanın dezavantajları vardır:

Şahsen TempData de kullanmıyorum. İçten Oturumu kullanır ve uygulamalarım oturum I devre dışı bırakmak için. Daha Dinlendirici bir şekilde bunu başarmak için tercih ederim. Hangisi: yönlendirme deposu veri deposu ve kullanıcı nesne yönlendirme oluşturulan benzersiz kimliği. gerçekleştiren ilk denetleyici eylem Hedef eylem bu kimliği başlangıçta saklanan nesneyi geri getirmek için 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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ELPRESADOR

    ELPRESADOR

    21 HAZİRAN 2008
  • hidetake takayama

    hidetake tak

    3 Mart 2009
  • Jeb Corliss

    Jeb Corliss

    17 Kasım 2006