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);
}
}
दृश्य वही रहता है।