ViewBag, ViewData dan TempData


209

Bisakah ada yang menjelaskan, kapan harus digunakan

  1. TempData
  2. ViewBag
  3. ViewData

Saya memiliki persyaratan, di mana saya harus menetapkan nilai dalam satu controller, bahwa controller akan mengarahkan ke Controller Two dan Controller Two akan membuat tampilan.

Saya telah mencoba menggunakan ViewBag, nilainya akan hilang pada saat saya mencapai Controller Two.

Bisakah saya tahu kapan harus menggunakan dan kelebihan atau kekurangan?

Terima kasih


5
Ini adalah pos yang bagus yang menjelaskan perbedaan.
Beku

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

Jawaban:


293

1) TempData

Memungkinkan Anda menyimpan data yang akan bertahan untuk pengalihan. Secara internal ia menggunakan Sesi sebagai backing store, setelah pengalihan dibuat data secara otomatis diusir. Polanya adalah sebagai berikut:

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

Memungkinkan Anda menyimpan data dalam aksi pengontrol yang akan digunakan dalam tampilan yang sesuai. Ini mengasumsikan bahwa tindakan mengembalikan tampilan dan tidak mengarahkan. Hidup hanya selama permintaan saat ini.

Polanya adalah sebagai berikut:

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

dan dalam tampilan:

@ViewBag.Foo

atau dengan ViewData:

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

dan dalam tampilan:

@ViewData["Foo"]

ViewBaghanya pembungkus dinamis ViewDatadan hanya ada di ASP.NET MVC 3.

Dikatakan demikian, tidak satupun dari dua konstruksi itu yang boleh digunakan. Anda harus menggunakan model tampilan dan tampilan yang sangat diketik. Jadi pola yang benar adalah sebagai berikut:

Lihat model:

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

Tindakan:

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

Tampilan sangat diketik:

@model MyViewModel
@Model.Foo

Setelah pengantar singkat ini, mari jawab pertanyaan Anda:

Persyaratan saya adalah saya ingin menetapkan nilai dalam satu pengontrol, pengontrol itu akan mengarahkan ulang ke ControllerTwo dan Controller2 akan membuat tampilan.

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);
    }
}

dan tampilan yang sesuai ( ~/Views/Two/Index.cshtml):

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

Ada juga kelemahan menggunakan TempData: jika pengguna menekan F5 pada halaman target, data akan hilang.

Secara pribadi saya juga tidak menggunakan TempData. Itu karena secara internal menggunakan Sesi dan saya menonaktifkan sesi di aplikasi saya. Saya lebih suka cara yang lebih tenang untuk mencapai ini. Yaitu: dalam tindakan pengontrol pertama yang melakukan pengalihan menyimpan objek di penyimpanan data Anda dan pengguna id unik yang dihasilkan saat mengarahkan. Kemudian pada tindakan target gunakan id ini untuk mengambil kembali objek yang awalnya disimpan:

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);
    }
}

Tampilannya tetap sama.


57
Jawaban yang bagus, tapi saya tidak setuju dengan pernyataan dogmatis "tidak satupun dari dua konstruksi itu yang boleh digunakan". Saya telah menemukan beberapa penggunaan yang sah untuk ViewBag. Misalnya, saya menetapkan ViewBag.Titleproperti pada semua Tampilan saya yang digunakan dalam _Layout.cshtmlfile tampilan basis saya . Kasus lain di mana saya menggunakannya adalah memberikan info-pesan (mis. "Produk berhasil disimpan!") Kepada pengguna. Saya menempatkan beberapa markup umum Layout.cshtmluntuk membuat pesan jika disediakan dan ini memungkinkan saya untuk mengatur ViewBag.Messagedalam Tindakan apa pun. Menggunakan properti ViewModel untuk kedua kasus memiliki terlalu banyak kerugian.
Jesse Webb

22
Saya harus setuju dengan Jesse, sementara ini adalah deskripsi yang sangat baik, terang-terangan menyatakan tidak ada alasan yang baik untuk menggunakan ViewBag adalah masalah pendapat, tidak ada masalah fakta. Ini tentu merupakan praktik yang buruk untuk terlalu sering menggunakan ViewBag, dan beberapa pengembang jatuh ke dalam jebakan ini, tetapi menggunakannya dengan penuh selera adalah sumber daya yang kuat.
Ron DeFreitas

1
@ ron.defreitas, baiklah, beri tahu saya satu alasan bagus mengapa Anda akan menggunakan ViewBag. Tolong jelaskan skenario dunia nyata yang spesifik, ketika ViewBag digunakan. Karena Anda mengatakan itu, saya mengutip sumber daya yang kuat , saya kira Anda memiliki beberapa kasus khusus di mana sumber daya yang kuat ini kuat . Karena saya tidak pernah menggunakannya dalam karir saya, saya akan sangat senang mengetahui bagaimana orang menggunakan senjata yang kuat ini .
Darin Dimitrov

27
Kami punya elit di sini. Darin, Jesse secara khusus menyebutkan satu contohnya. Hanya karena selalu ada cara lain untuk melakukan sesuatu tidak secara otomatis meniadakan kegunaannya.
Djentleman

2
@DarinDimitrov: Saya memiliki skenario saat ini di mana saya perlu menyampaikan beberapa informasi ke tampilan dari dalam metode atribut. Menggunakan filterContext.Controller.ViewData secara substansial lebih mudah daripada mencoba meneruskannya ke tampilan yang sangat diketik. Yang mengatakan, terima kasih atas penjelasannya, itu sangat berguna.
Andy

15

ASP.NET MVC menawarkan kepada kami tiga opsi ViewData, ViewBag, dan TempData untuk meneruskan data dari controller untuk melihat dan dalam permintaan berikutnya. ViewData dan ViewBag hampir serupa dan TempData melakukan tanggung jawab tambahan. Mari kita bahas atau dapatkan poin-poin penting pada ketiga objek tersebut:

Kesamaan antara ViewBag & ViewData:

  • Membantu menjaga data saat Anda berpindah dari pengontrol ke tampilan.
  • Digunakan untuk meneruskan data dari pengontrol ke tampilan yang sesuai.
  • Umur pendek berarti nilai menjadi nol ketika pengalihan terjadi. Ini karena tujuan mereka adalah untuk menyediakan cara untuk berkomunikasi antara pengontrol dan pandangan. Ini adalah mekanisme komunikasi dalam panggilan server.

Perbedaan antara ViewBag & ViewData:

  • ViewData adalah kamus objek yang diturunkan dari kelas ViewDataDictionary dan dapat diakses menggunakan string sebagai kunci.
  • ViewBag adalah properti dinamis yang memanfaatkan fitur dinamis baru di C # 4.0.
  • ViewData membutuhkan typecasting untuk tipe data yang kompleks dan memeriksa nilai null untuk menghindari kesalahan.
  • ViewBag tidak memerlukan typecasting untuk tipe data yang kompleks.

Contoh ViewBag & ViewData:

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


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

Dalam penglihatan:

@ViewBag.Name 
@ViewData["Name"] 

TempData:

TempData juga merupakan kamus yang diturunkan dari kelas TempDataDictionary dan disimpan dalam sesi live pendek dan merupakan kunci string dan nilai objek. Perbedaannya adalah bahwa siklus hidup objek. TempData menyimpan informasi untuk saat Permintaan HTTP. Ini berarti hanya dari satu halaman ke halaman lainnya. Ini juga berfungsi dengan pengalihan 302/303 karena itu dalam Permintaan HTTP yang sama. Membantu menjaga data saat Anda berpindah dari satu pengontrol ke pengontrol lain atau dari satu aksi ke aksi lainnya. Dengan kata lain ketika Anda mengarahkan ulang, "TempData" membantu menjaga data antara pengalihan tersebut. Secara internal menggunakan variabel sesi. Temp menggunakan data selama permintaan saat ini dan selanjutnya hanya berarti itu digunakan ketika Anda yakin bahwa permintaan berikutnya akan diarahkan ke tampilan berikutnya. Ini membutuhkan typecasting untuk tipe data yang kompleks dan memeriksa nilai-nilai nol untuk menghindari kesalahan.

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);
}

Mekanisme terakhir adalah Sesi yang berfungsi seperti ViewData, seperti Kamus yang mengambil string untuk kunci dan objek untuk nilai. Yang ini disimpan ke dalam Cookie klien dan dapat digunakan untuk waktu yang jauh lebih lama. Perlu verifikasi lebih lanjut untuk tidak pernah memiliki informasi rahasia. Mengenai ViewData atau ViewBag Anda harus menggunakannya secara cerdas untuk kinerja aplikasi. Karena setiap tindakan melewati seluruh siklus hidup permintaan mvc asp.net biasa. Anda bisa menggunakan ViewData / ViewBag dalam aksi anak Anda tetapi berhati-hatilah karena Anda tidak menggunakannya untuk mengisi data yang tidak terkait yang dapat mencemari pengontrol Anda.


11

TempData

Pada dasarnya ini seperti DataReader, setelah dibaca, data akan hilang.

Lihat Video ini

Contoh

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();
    }
}

Jika Anda memperhatikan kode di atas, RedirectToAction tidak memiliki dampak terhadap TempData hingga TempData dibaca. Jadi, begitu TempData dibaca, nilainya akan hilang.

Bagaimana saya bisa menjaga TempData setelah membaca?

Periksa output di Action Metode Test 1 dan Test 2

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();
    }
}

Jika Anda memperhatikan kode di atas, data tidak hilang setelah RedirectToAction serta setelah Membaca Data dan alasannya adalah, Kami menggunakan TempData.Keep() . Apakah itu

Dengan cara ini Anda dapat membuatnya bertahan selama yang Anda inginkan di pengontrol lain juga.

ViewBag / ViewData

Data akan tetap ada pada Tampilan yang sesuai


4

TempData di Asp.Net MVC adalah salah satu fitur yang sangat berguna. Ini digunakan untuk meneruskan data dari permintaan saat ini ke permintaan berikutnya. Dengan kata lain jika kita ingin mengirim data dari satu halaman ke halaman lain saat pengalihan terjadi, kita dapat menggunakan TempData, tetapi kita perlu melakukan beberapa pertimbangan dalam kode untuk mencapai fitur ini di MVC. Karena kehidupan TempData sangat singkat dan terletak hanya sampai tampilan target terisi penuh. Tapi, kita bisa menggunakan metode Keep () untuk bertahan data di TempData.

Baca lebih banyak


3

ViewBag, ViewData, TempData, dan View State dalam MVC

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

ASP.NET MVC menawarkan kepada kami tiga opsi ViewData, VieBag dan TempData untuk meneruskan data dari controller untuk melihat dan dalam permintaan berikutnya. ViewData dan ViewBag hampir serupa dan TempData melakukan tanggung jawab tambahan.

Kesamaan antara ViewBag & ViewData:

Membantu menjaga data saat Anda berpindah dari pengontrol ke tampilan. Digunakan untuk meneruskan data dari pengontrol ke tampilan yang sesuai. Umur pendek berarti nilai menjadi nol ketika pengalihan terjadi. Ini karena tujuan mereka adalah untuk menyediakan cara untuk berkomunikasi antara pengontrol dan pandangan. Ini adalah mekanisme komunikasi dalam panggilan server.

Perbedaan antara ViewBag & ViewData:

ViewData adalah kamus objek yang diturunkan dari kelas ViewDataDictionary dan dapat diakses menggunakan string sebagai kunci. ViewBag adalah properti dinamis yang memanfaatkan fitur dinamis baru di C # 4.0. ViewData membutuhkan typecasting untuk tipe data yang kompleks dan memeriksa nilai null untuk menghindari kesalahan. ViewBag tidak memerlukan typecasting untuk tipe data yang kompleks.

Contoh ViewBag & ViewData:

public ActionResult Index()

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

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

Dalam Lihat, kami memanggil seperti di bawah ini:

@ViewBag.Name   
@ViewData["Name"]

TempData:

Membantu menjaga data saat Anda berpindah dari satu pengontrol ke pengontrol lain atau dari satu aksi ke aksi lainnya. Dengan kata lain ketika Anda mengarahkan ulang, "Tempdata" membantu menjaga data antara pengalihan tersebut. Secara internal menggunakan variabel sesi. TempData dimaksudkan untuk menjadi contoh yang sangat singkat, dan Anda hanya boleh menggunakannya selama permintaan saat ini dan berikutnya saja

Satu-satunya skenario di mana menggunakan TempData akan bekerja dengan andal adalah ketika Anda mengarahkan ulang. Ini karena pengalihan membunuh permintaan saat ini (dan mengirimkan kode status HTTP 302 Objek Pindah ke klien), kemudian membuat permintaan baru di server untuk melayani tampilan yang dialihkan.

Ini membutuhkan typecasting untuk tipe data yang kompleks dan memeriksa nilai-nilai nol untuk menghindari kesalahan.

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 akan selalu tersedia hingga dibaca pertama, setelah Anda membacanya, itu tidak tersedia lagi dapat berguna untuk menyampaikan pesan cepat juga untuk melihat yang akan hilang setelah membaca pertama. ViewBag Ini lebih berguna ketika meneruskan sepotong data dengan cepat ke tampilan, biasanya Anda harus meneruskan semua data ke tampilan melalui model, tetapi ada kasus ketika Anda memodelkan datang langsung dari kelas yang memetakan ke dalam database seperti kerangka kerja entitas dalam hal ini Anda tidak apa yang akan mengubah model Anda untuk melewatkan data baru, Anda dapat memasukkannya ke dalam viewbag ViewData hanya versi indeks dari ViewBag dan digunakan sebelum MVC3


0

Lingkupnya juga berbeda antara viewbag dan temptdata. viewbag didasarkan pada tampilan pertama (tidak dibagi antara metode tindakan) tetapi temptdata dapat dibagi antara metode tindakan dan hanya satu sama lain.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.