2013-03-04 3 views
10

व्यूडाटा और व्यूबैग आपको नियंत्रक से पारित किए गए किसी भी डेटा तक पहुंचने की अनुमति देता है।व्यूबैग, व्यूडाटा, टेम्पडडाटा, सत्र - उन्हें कैसे और कब उपयोग करें?

उन दोनों के बीच मुख्य अंतर यह है कि आप डेटा तक पहुंच रहे हैं। व्यूबैग में आप स्ट्रिंग के रूप में स्ट्रिंग का उपयोग कर डेटा तक पहुंच रहे हैं - व्यूबैग ["संख्याएं]] व्यूडेटा में आप गुणों का उपयोग कर डेटा तक पहुंच रहे हैं - ViewData.numbers।

ViewData उदाहरण

नियंत्रक

var Numbers = new List<int> { 1, 2, 3 }; 

      ViewData["numbers"] = Numbers; 

देखें

<ul> 
@foreach (var number in (List<int>)ViewData["numbers"]) 
{ 
    <li>@number</li> 
} 

</ul> 

ViewBag उदाहरण

नियंत्रक

var Numbers = new List<int> { 1, 2, 3 }; 

     ViewBag.numbers = Numbers; 

देखें

<ul> 

@foreach (var number in ViewBag.numbers) 

{ 
<li>@number</li> 
} 

</ul> 

सत्र एक और बहुत उपयोगी वस्तु है कि किसी भी जानकारी को रखा जाता है।

उदाहरण के लिए जब उपयोगकर्ता सिस्टम में लॉग इन होता है तो आप उसका प्राधिकरण स्तर रखना चाहते हैं।

// GetUserAuthorizationLevel - some method that returns int value for user authorization level. 

Session["AuthorizationLevel"] = GetUserAuthorizationLevel(userID); 

यह जानकारी जब तक उपयोगकर्ता सत्र के सक्रिय सत्र में संग्रहीत किया जाएगा।

public ActionResult LevelAccess() 
    { 
     if (Session["AuthorizationLevel"].Equals(1)) 
     { 
      return View("Level1"); 
     } 

     if (Session["AuthorizationLevel"].Equals(2)) 
     { 
      return View("Level2"); 
     } 

     return View("AccessDenied"); 
    } 

TempData बहुत ViewData और ViewBag हालांकि यह केवल का डेटा होगा के समान है: कार्रवाई के अंदर नियंत्रक में

<system.web> 
    <sessionState mode="InProc" timeout="30"/> 

तो फिर: यह Web.config फ़ाइल में बदला जा सकता है एक अनुरोध।

नियंत्रक

// आप नए ग्राहक जोड़ने के लिए एक विधि बनाया। जब आप नियंत्रक को देखें से कुछ जानकारी पास करना चाहते हैं

TempData["ClientAdded"] = "Client has been added"; 

देखें

@if (TempData["ClientAdded"] != null) 
{ 
    <h3>@TempData["ClientAdded"] </h3> 
} 

TempData उपयोगी है। उदाहरण के लिए जब आप अनुरोध किया गया था तो आप समय पकड़ना चाहते हैं।

देखें

@{ 
TempData["DateOfViewWasAccessed"] = DateTime.Now; 
} 

नियंत्रक

if (TempData["DateOfViewWasAccessed"] != null) 
    { 
    DateTime time = DateTime.Parse(TempData["DateOfViewWasAccessed"].ToString()); 
    } 
+0

इस पर अधिक जानकारी के लिए धन्यवाद! यह ज्यादातर लोगों के लिए वास्तव में उपयोगी होना चाहिए। –

+0

क्या कोई प्रश्न है या यह ब्लॉग पोस्ट है? अपने प्रश्न का उत्तर देना ठीक है लेकिन इसे प्रश्न के हिस्से के रूप में नहीं, जवाब के रूप में किया जाना चाहिए। सबसे महत्वपूर्ण बात यह है कि, इस सामग्री को पहले ही कवर कर लिया गया है, जैसे कि [व्यूडाटा, व्यूबैग, सत्र, टेम्पडडाटा के लिए सही समय क्या है] (http://stackoverflow.com/questions/12676924/what-is-the-right-time -for-viewdata-viewbag-session-tempdata) –

+0

मुझे याद होगा कि भविष्य के लिए और इसके लिए खेद है। मैंने कुछ और उदाहरण देने की कोशिश की और शायद कुछ और अनुभवी डेवलपर्स भी अपने अनुभव साझा करते हैं। –

उत्तर

11

ViewBag, ViewData, TempData, सत्र - उन्हें कैसे और कब उपयोग करने के लिए?

ViewBag

यह से बचें। जब आप कर सकते हैं तो एक दृश्य मॉडल का प्रयोग करें।

कारण यह है कि जब आप गतिशील गुणों का उपयोग करते हैं तो आपको संकलन त्रुटियां नहीं मिलेंगी। संपत्ति के नाम को दुर्घटना या उद्देश्य से बदलना वास्तव में आसान है और फिर सभी उपयोगों को अपडेट करना भूल जाते हैं।

यदि आप व्यूमोडेल का उपयोग करते हैं तो आपको वह समस्या नहीं होगी। एक व्यू मॉडल नियंत्रक से एमवीसी में "एम" (यानी व्यवसाय संस्थाएं) को अनुकूलित करने और व्यूमोडेल के दृश्य को अनुकूलित करने की ज़िम्मेदारी भी लेता है, इस प्रकार आपको स्पष्ट जिम्मेदारियों के साथ क्लीनर कोड मिलता है।

कार्रवाई

public ActionResult Index() 
{ 
    ViewBag.SomeProperty = "Hello"; 
    return View(); 
} 

देखें (उस्तरा वाक्य रचना)

@ViewBag.SomeProperty 

ViewData

Avoit यह।जब आप कर सकते हैं तो एक दृश्य मॉडल का प्रयोग करें। व्यूबैग के समान कारण।

कार्रवाई

public ActionResult Index() 
{ 
    ViewData["SomeProperty"] = "Hello"; 
    return View(); 
} 

देखें (उस्तरा वाक्य रचना):

@ViewData["SomeProperty"] 

अस्थायी डेटा

सब कुछ है कि आप TempData में स्टोर जब तक आप इसे पढ़ tempdata में रहेगी, कोई फर्क नहीं पड़ता कि बीच में एक या कई HTTP अनुरोध हैं।

क्रिया

public ActionResult Index() 
{ 
    TempData["SomeName"] = "Hello"; 
    return RedirectToAction("Details"); 
} 


public ActionResult Details() 
{ 
    var someName = TempData["SomeName"]; 
} 
+1

"जब आपको कई अनुरोधों पर जानकारी जारी रखने की आवश्यकता होती है" - मुझे लगता है कि TempData केवल तब तक अच्छा है जब तक इसे पढ़ा न जाए। मुझे लगता है कि यहां कई अनुरोधों का उपयोग थोड़ा भ्रामक है। – Tommy

+1

मेरा मतलब यह है कि जब तक आप इसे पढ़ नहीं लेते तब तक यह अस्थायी डेटा में रहता है, भले ही यह दो अनुरोध या 10 के बीच में हो। लेकिन मुझे आपका अंक मिलता है और विस्तृत होगा। – jgauffin

+0

व्यूबैग के लिए +1 - इसे –

3

TempData

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

ViewData

ViewData एक शब्दकोश उद्देश्य यह है कि आप में है, जो तब देखने के लिए उपलब्ध हो जाता है डेटा डाल है। ViewData ViewDataDictionary क्लास का व्युत्पन्न है, इसलिए आप परिचित "कुंजी/मान" वाक्यविन्यास तक पहुंच सकते हैं।

ViewBag

ViewBag वस्तु ViewData उद्देश्य यह है कि आप ViewBag के लिए गतिशील गुण बनाने की अनुमति देता के चारों ओर एक आवरण है।

public class HomeController : Controller 
{ 
    // ViewBag & ViewData sample 
    public ActionResult Index() 
    { 
     var featuredProduct = new Product 
     { 
      Name = "Special Cupcake Assortment!", 
      Description = "Delectable vanilla and chocolate cupcakes", 
      CreationDate = DateTime.Today, 
      ExpirationDate = DateTime.Today.AddDays(7), 
      ImageName = "cupcakes.jpg", 
      Price = 5.99M, 
      QtyOnHand = 12 
     }; 

     ViewData["FeaturedProduct"] = featuredProduct; 
     ViewBag.Product = featuredProduct; 
     TempData["FeaturedProduct"] = featuredProduct; 

     return View(); 
    } 
} 
0
namespace TempData.Controllers 
{ 
public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     TempData["hello"] = "test"; // still alive 
     return RedirectToAction("About"); 
    } 

    public ActionResult About() 
    { 
     //ViewBag.Message = "Your application description page."; 
     var sonename = TempData["hello"]; // still alive (second time) 
     return RedirectToAction("Contact"); 
    } 


    public ActionResult Contact() 
    { 
     var scondtime = TempData["hello"]; // still alive(third time) 
     return View(); 
    } 
    public ActionResult afterpagerender() 
    { 
     var scondtime = TempData["hello"];//now temp data value becomes null 

     return View(); 
    } 
} 

}

ऊपर बातचीत में, वहाँ सभी के लिए थोड़ा भ्रमित है। यदि आप मेरे उपरोक्त कोड को देखते हैं, तो tempdata व्यूडेटा अवधारणा की तरह है लेकिन फिर यह अन्य दृश्य को भी रीडायरेक्ट करने में सक्षम है। यह पहला बिंदु है।

दूसरा बिंदु: उनमें से कुछ कह रहे हैं कि यह पढ़ने तक मूल्य बनाए रखता है और उनमें से कुछ पूछ रहे हैं कि क्या यह केवल समय ही पढ़ेगा? ऐसा नहीं। असल में, आप पृष्ठ प्रस्तुत करने से पहले एक पोस्टपैक में अपने कोड के अंदर किसी भी समय पढ़ सकते हैं। एक बार पृष्ठ प्रस्तुत होने पर, यदि आप दोबारा पोस्टपैक (अनुरोध) का अर्थ करते हैं, तो tempdata मान शून्य हो जाता है।

यहां तक ​​कि आप इतने सारे समय का अनुरोध कर रहे हैं, लेकिन tempdata मान अभी भी जिंदा है -> इस मामले में आपके अनुरोध की संख्या temp डेटा मान नहीं पढ़नी चाहिए।

संबंधित मुद्दे