ViewBag, ViewData और TempData


209

कोई भी शरीर समझा सकता है, कब उपयोग करना है

  1. TempData
  2. ViewBag
  3. ViewData

मेरे पास एक आवश्यकता है, जहां मुझे नियंत्रक एक में एक मूल्य निर्धारित करने की आवश्यकता है, वह नियंत्रक नियंत्रक दो पर पुनर्निर्देशित करेगा और नियंत्रक दो दृश्य प्रस्तुत करेगा।

मैंने ViewBag का उपयोग करने की कोशिश की है, जब तक मैं नियंत्रक दो तक नहीं पहुंच जाता, तब तक मूल्य खो जाता है।

क्या मुझे पता है कि कब उपयोग करना है और फायदे या नुकसान?

धन्यवाद


5
यह एक महान पद है जो मतभेदों की व्याख्या करता है।
बेक्कू

1
stackoverflow.com/a/17199709/2015869
इमाद अलाज़ानी

जवाबों:


293

1) TempData

आपको डेटा को संग्रहीत करने की अनुमति देता है जो एक रीडायरेक्ट के लिए जीवित रहेगा। आंतरिक रूप से यह बैकिंग स्टोर के रूप में सत्र का उपयोग करता है, पुनर्निर्देशित किए जाने के बाद डेटा स्वचालित रूप से बेदखल हो जाता है। पैटर्न निम्नलिखित है:

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

आपको नियंत्रक क्रिया में डेटा संग्रहीत करने की अनुमति देता है जिसका उपयोग संबंधित दृश्य में किया जाएगा। यह मानता है कि कार्रवाई एक दृश्य लौटाती है और पुनर्निर्देशित नहीं करती है। वर्तमान अनुरोध के दौरान ही रहता है।

पैटर्न निम्नलिखित है:

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

और देखने में:

@ViewBag.Foo

या ViewData के साथ:

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

और देखने में:

@ViewData["Foo"]

ViewBagबस एक डायपर रैपर है ViewDataऔर केवल ASP.NET MVC 3 में मौजूद है।

यह कहा जा रहा है, उन दो निर्माणों में से किसी का कभी भी उपयोग नहीं किया जाना चाहिए। आपको व्यू मॉडल और दृढ़ता से टाइप किए गए विचारों का उपयोग करना चाहिए। तो सही पैटर्न निम्नलिखित है:

देखें मॉडल:

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

क्रिया:

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

दृढ़ता से टाइप किया गया दृश्य:

@model MyViewModel
@Model.Foo

इस संक्षिप्त परिचय के बाद आइए आपके प्रश्न का उत्तर दें:

मेरी आवश्यकता यह है कि मैं एक नियंत्रक एक मूल्य निर्धारित करना चाहता हूं, यह नियंत्रक नियंत्रकट्वो पर पुनर्निर्देशित करेगा और नियंत्रक 2 दृश्य प्रस्तुत करेगा।

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

और इसी दृश्य ( ~/Views/Two/Index.cshtml):

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

TempData का उपयोग करने की कमियां भी हैं: यदि उपयोगकर्ता लक्ष्य पृष्ठ पर F5 हिट करता है तो डेटा खो जाएगा।

व्यक्तिगत रूप से मैं न तो TemDData का उपयोग करें और न ही। यह इसलिए है क्योंकि आंतरिक रूप से यह सत्र का उपयोग करता है और मैं अपने अनुप्रयोगों में सत्र को अक्षम करता हूं। मैं इसे प्राप्त करने के लिए एक अधिक प्रतिष्ठित तरीका पसंद करता हूं। जो है: पहले कंट्रोलर एक्शन में जो आपके डेटा स्टोर में ऑब्जेक्ट को रीडायरेक्ट करता है और रीडायरेक्ट करने पर यूनीक आईडी जनरेट करता है। फिर लक्ष्य कार्रवाई पर शुरू में संग्रहीत वस्तु को वापस लाने के लिए इस आईडी का उपयोग करें:

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

दृश्य वही रहता है।


57
महान जवाब, लेकिन मैं हठधर्मिता के बयान से असहमत हूं "उन दो निर्माणों में से किसी का भी कभी उपयोग नहीं किया जाना चाहिए"। मैंने ViewBag के लिए कुछ वैध उपयोग किए हैं। उदाहरण के लिए, मैंने ViewBag.Titleअपने सभी दृश्यों पर एक संपत्ति निर्धारित की है जो मेरे _Layout.cshtmlआधार दृश्य फ़ाइल में उपयोग की जाती है । एक अन्य मामला जहां मैं इसका उपयोग करता हूं वह उपयोगकर्ताओं को जानकारी-संदेश (जैसे "उत्पाद सफलतापूर्वक सहेजा गया है!") दे रहा है। यदि मैंने Layout.cshtmlकोई संदेश प्रदान करने के लिए कुछ सामान्य मार्कअप रखे हैं और यह मुझे ViewBag.Messageकिसी भी कार्रवाई में सेट करने की अनुमति देता है । किसी भी स्थिति के लिए एक ViewModel संपत्ति का उपयोग करने के कई नुकसान हैं।
जेसी वेब वेब

22
मुझे जेसी के साथ सहमत होना होगा, जबकि यह एक उत्कृष्ट विवरण है, स्पष्ट रूप से बताते हुए कि ViewBag का उपयोग करने का कोई अच्छा कारण नहीं है यह एक राय का विषय है, कोई बात नहीं है। व्यूबाग को अति प्रयोग करने के लिए यह निश्चित रूप से एक बुरा अभ्यास है, और कुछ डेवलपर्स इस जाल में पड़ जाते हैं, लेकिन स्वादपूर्वक इसका उपयोग एक शक्तिशाली संसाधन है।
रॉन डेफ्रेटास

1
@ ron.defreitas, ठीक है, मुझे बताओ तो एक अच्छा कारण है कि आप क्यों उपयोग करेंगे ViewBag। कृपया एक विशिष्ट, वास्तविक दुनिया परिदृश्य का वर्णन करें, जब ViewBag का कुछ उपयोग होता है। आप कह रहे हैं के बाद से यह है कि, मैं बोली एक शक्तिशाली संसाधन है, मैं तुम्हें कुछ विशेष मामलों में जहां इस राशि लगता है कि शक्तिशाली संसाधन है शक्तिशाली । चूंकि मैंने इसे अपने करियर में कभी इस्तेमाल नहीं किया है, मुझे यह जानकर बहुत खुशी होगी कि लोग इस शक्तिशाली हथियार का उपयोग कैसे कर रहे हैं ।
डारिन दिमित्रोव

27
हमारे यहाँ एक अभिजात्य वर्ग है। डारिन, जेसी ने विशेष रूप से एक ऐसे उदाहरण का उल्लेख किया। सिर्फ इसलिए कि चीजों को करने के अन्य तरीके हमेशा स्वचालित रूप से उनकी उपयोगिता को नकारते नहीं हैं।
जेंटलमैन

2
@DarinDimitrov: मेरे पास अभी एक परिदृश्य है जहां मुझे एक विशेषता विधि के भीतर से देखने के लिए कुछ जानकारी पास करने की आवश्यकता है। FilterContext.Controller.ViewData का उपयोग करना एक दृढ़ता से टाइप किए गए दृश्य को पारित करने की कोशिश करने की तुलना में काफी आसान है। उस ने कहा, आपके स्पष्टीकरण के लिए धन्यवाद, यह बहुत उपयोगी था।
एंडी

15

ASP.NET MVC हमें नियंत्रक से देखने और अगले अनुरोध में डेटा पास करने के लिए ViewData, ViewBag और TempData तीन विकल्प प्रदान करता है। ViewData और ViewBag लगभग समान हैं और TempData अतिरिक्त जिम्मेदारी करता है। उन तीन वस्तुओं पर मुख्य बिंदुओं पर चर्चा करें या प्राप्त करें:

ViewBag और ViewData के बीच समानताएं:

  • जब आप नियंत्रक से देखने के लिए स्थानांतरित करते हैं तो डेटा बनाए रखने में मदद करता है।
  • नियंत्रक से संबंधित दृश्य में डेटा पास करने के लिए उपयोग किया जाता है।
  • लघु जीवन का अर्थ है जब पुनर्निर्देशन होता है तो मूल्य शून्य हो जाता है। ऐसा इसलिए है क्योंकि उनका लक्ष्य नियंत्रकों और विचारों के बीच संवाद करने का एक तरीका प्रदान करना है। यह सर्वर कॉल के भीतर एक संचार तंत्र है।

ViewBag और ViewData के बीच अंतर:

  • ViewData ऑब्जेक्ट्स का एक शब्दकोश है जो ViewDataDictionary वर्ग से प्राप्त होता है और कुंजी के रूप में तार का उपयोग करके सुलभ होता है।
  • ViewBag एक गतिशील संपत्ति है जो C # 4.0 में नई गतिशील सुविधाओं का लाभ उठाती है।
  • ViewData को जटिल डेटा प्रकार के लिए टाइपकास्टिंग की आवश्यकता होती है और त्रुटि से बचने के लिए अशक्त मानों की जांच करनी चाहिए।
  • ViewBag को जटिल डेटा प्रकार के लिए टाइपकास्टिंग की आवश्यकता नहीं होती है।

ViewBag और ViewData उदाहरण:

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


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

दृश्य में:

@ViewBag.Name 
@ViewData["Name"] 

TempData:

TempData भी एक TempDataDictionary वर्ग से व्युत्पन्न शब्दकोश है और लघु जीवन सत्र में संग्रहीत है और यह एक स्ट्रिंग कुंजी और ऑब्जेक्ट मान है। अंतर यह है कि वस्तु का जीवन चक्र। TempData HTTP अनुरोध के समय की जानकारी रखता है। इसका मतलब केवल एक पेज से दूसरे पेज पर है। यह 302/303 पुनर्निर्देशन के साथ भी काम करता है क्योंकि यह उसी HTTP अनुरोध में है। जब आप एक कंट्रोलर से दूसरे कंट्रोलर या एक एक्शन से दूसरे एक्शन पर जाते हैं तो डेटा को बनाए रखने में मदद करता है। दूसरे शब्दों में, जब आप रीडायरेक्ट करते हैं, तो "टेंपडाटा" उन रीडायरेक्ट के बीच डेटा को बनाए रखने में मदद करता है। यह आंतरिक रूप से सत्र चर का उपयोग करता है। वर्तमान और बाद के अनुरोध के दौरान अस्थायी डेटा का उपयोग केवल इसका मतलब है कि इसका उपयोग तब किया जाता है जब आप सुनिश्चित हों कि अगला अनुरोध अगले दृश्य पर पुनर्निर्देशित होगा। इसमें जटिल डेटा प्रकार के लिए टाइपकास्टिंग की आवश्यकता होती है और त्रुटि से बचने के लिए अशक्त मानों की जांच की जाती है।

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

अंतिम तंत्र सत्र है जो व्यूडाटा की तरह काम करता है, एक शब्दकोश की तरह जो मूल्य के लिए कुंजी और ऑब्जेक्ट के लिए एक स्ट्रिंग लेता है। यह एक ग्राहक कुकी में संग्रहीत किया जाता है और इसे अधिक लंबे समय तक उपयोग किया जा सकता है। किसी भी गोपनीय जानकारी के लिए कभी भी अधिक सत्यापन की आवश्यकता नहीं है। ViewData या ViewBag के बारे में आपको आवेदन प्रदर्शन के लिए समझदारी से इसका उपयोग करना चाहिए। क्योंकि प्रत्येक क्रिया नियमित रूप से asp.net mvc अनुरोध के पूरे जीवन चक्र से गुजरती है। आप अपने बच्चे की कार्रवाई में ViewData / ViewBag का उपयोग कर सकते हैं, लेकिन सावधान रहें कि आप इसका उपयोग असंबंधित डेटा को पॉप्युलेट करने के लिए नहीं कर रहे हैं जो आपके नियंत्रक को प्रदूषित कर सकता है।


11

TempData

मूल रूप से यह एक DataReader की तरह है, एक बार पढ़ने के बाद डेटा खो जाएगा।

इस वीडियो को देखें

उदाहरण

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

यदि आप उपरोक्त कोड पर ध्यान देते हैं, तो RedirectToAction का TempData पर कोई प्रभाव नहीं पड़ता है जब तक कि TempData को नहीं पढ़ा जाता है। इसलिए, एक बार TempData पढ़ने के बाद, मान खो जाएंगे।

मैं पढ़ने के बाद टेंपडाटा कैसे रख सकता हूं?

एक्शन मेथड टेस्ट 1 और टेस्ट 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();
    }
}

यदि आप उपरोक्त कोड पर ध्यान देते हैं, तो RedirectToAction के साथ-साथ डेटा को पढ़ने के बाद डेटा खो नहीं जाता है और इसका कारण है, हम उपयोग कर रहे हैं TempData.Keep()। क्या वह

इस तरह आप इसे तब तक जारी रख सकते हैं जब तक आप अन्य नियंत्रकों में भी चाहें।

ViewBag / ViewData

डेटा संगत दृश्य के लिए जारी रहेगा


4

Asp.Net MVC में TempData एक बहुत ही उपयोगी विशेषता है। इसका उपयोग वर्तमान अनुरोध से डेटा को बाद में अनुरोध करने के लिए किया जाता है। दूसरे शब्दों में अगर हम पुनर्निर्देशन करते समय एक पृष्ठ से दूसरे पृष्ठ पर डेटा भेजना चाहते हैं, तो हम TempData का उपयोग कर सकते हैं, लेकिन हमें MVC में इस सुविधा को प्राप्त करने के लिए कोड पर कुछ विचार करने की आवश्यकता है। क्योंकि टेंपडाटा का जीवन बहुत छोटा है और केवल तब तक झूठ है जब तक कि लक्ष्य दृश्य पूरी तरह से लोड नहीं हो जाता। लेकिन, हम TempData में डेटा को बनाए रखने के लिए Keep () विधि का उपयोग कर सकते हैं।

अधिक पढ़ें


3

MVC में ViewBag, ViewData, TempData और View State

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

ASP.NET MVC हमें नियंत्रक से देखने और अगले अनुरोध में डेटा पास करने के लिए ViewData, VieBag और TempData तीन विकल्प प्रदान करता है। ViewData और ViewBag लगभग समान हैं और TempData अतिरिक्त जिम्मेदारी करता है।

ViewBag और ViewData के बीच समानताएं:

जब आप नियंत्रक से देखने के लिए स्थानांतरित करते हैं तो डेटा बनाए रखने में मदद करता है। नियंत्रक से संबंधित दृश्य में डेटा पास करने के लिए उपयोग किया जाता है। लघु जीवन का अर्थ है जब पुनर्निर्देशन होता है तो मूल्य शून्य हो जाता है। ऐसा इसलिए है क्योंकि उनका लक्ष्य नियंत्रकों और विचारों के बीच संवाद करने का एक तरीका प्रदान करना है। यह सर्वर कॉल के भीतर एक संचार तंत्र है।

ViewBag और ViewData के बीच अंतर:

ViewData ऑब्जेक्ट्स का एक शब्दकोश है जो ViewDataDictionary वर्ग से प्राप्त होता है और कुंजी के रूप में तार का उपयोग करके सुलभ होता है। ViewBag एक गतिशील संपत्ति है जो C # 4.0 में नई गतिशील सुविधाओं का लाभ उठाती है। ViewData को जटिल डेटा प्रकार के लिए टाइपकास्टिंग की आवश्यकता होती है और त्रुटि से बचने के लिए अशक्त मानों की जांच करनी चाहिए। ViewBag को जटिल डेटा प्रकार के लिए टाइपकास्टिंग की आवश्यकता नहीं होती है।

ViewBag और ViewData उदाहरण:

public ActionResult Index()

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

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

दृश्य में, हम नीचे की तरह कॉल करते हैं:

@ViewBag.Name   
@ViewData["Name"]

TempData:

जब आप एक कंट्रोलर से दूसरे कंट्रोलर या एक एक्शन से दूसरे एक्शन पर जाते हैं तो डेटा को बनाए रखने में मदद करता है। दूसरे शब्दों में, जब आप रीडायरेक्ट करते हैं, तो "टेंपडाटा" उन रीडायरेक्ट के बीच डेटा को बनाए रखने में मदद करता है। यह आंतरिक रूप से सत्र चर का उपयोग करता है। टेंपडाटा का अर्थ बहुत कम समय तक रहने वाला उदाहरण है, और आपको इसे केवल वर्तमान और बाद के अनुरोधों के दौरान ही उपयोग करना चाहिए

एकमात्र परिदृश्य जहां TempData का उपयोग करना मज़बूती से काम करेगा जब आप पुनर्निर्देशित कर रहे हैं। ऐसा इसलिए है क्योंकि एक रीडायरेक्ट वर्तमान अनुरोध को मारता है (और क्लाइंट को HTTP स्थिति कोड 302 ऑब्जेक्ट मूव करता है) भेजता है, फिर सर्वर पर रीडायरेक्ट किए गए दृश्य को परोसने के लिए एक नया अनुरोध बनाता है।

इसमें जटिल डेटा प्रकार के लिए टाइपकास्टिंग की आवश्यकता होती है और त्रुटि से बचने के लिए अशक्त मानों की जांच की जाती है।

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

टेंपडाटा हमेशा पहले पढ़ने तक उपलब्ध रहेगा, एक बार जब आप इसे पढ़ लेते हैं तो इसका कोई और उपलब्ध नहीं होता है जो त्वरित संदेश को पास करने के लिए उपयोगी हो सकता है यह देखने के लिए कि पहले पढ़ने के बाद चला जाएगा। ViewBag दृश्य में डेटा के त्वरित टुकड़े को पास करते समय इसका अधिक उपयोगी है, आम तौर पर आपको मॉडल के माध्यम से दृश्य में सभी डेटा को पास करना चाहिए, लेकिन ऐसे मामले हैं जब आप क्लास से सीधे आने वाले मॉडल को डेटाबेस में मैप करते हैं जो उस मामले में इकाई ढांचे की तरह होता है जब आप डॉन करते हैं 'डेटा का एक नया टुकड़ा पास करने के लिए आपको क्या मॉडल बदलना है, आप देख सकते हैं कि व्यूबैग में ViewData केवल ViewBag का अनुक्रमित संस्करण है और MVC3 से पहले उपयोग किया गया था


0

इसके अलावा दृश्य और प्रलोभता के बीच गुंजाइश अलग है। व्यूबैग पहले दृश्य पर आधारित है (एक्शन विधियों के बीच साझा नहीं किया गया है) लेकिन लुभाने को एक्शन विधि और सिर्फ एक दूसरे के बीच साझा किया जा सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.