2012-01-06 19 views
8

मैं TempData (रूबी की तरह) एक फ्लैश संदेश के लिए मेरे सहायक में उपयोग करने के लिए चाहते हैंउपयोग TempData: नाम 'TempData' वर्तमान संदर्भ में मौजूद नहीं है

मैं एक मिल

The name 'TempData' does not exist in the current context 

मेरी Flash.cshtml की रनटाइम त्रुटि के रूप में लेआउट में

@helper Show() 
{ 
    var message = "test message"; 
    var className = "info"; 

    if (TempData["info"] != null) 
    { 
     message = TempData["info"].ToString(); 
     className = "info"; 
    } 
    else if (TempData["warning"] != null) 
    { 
     message = TempData["warning"].ToString(); 
     className = "warning"; 
    } 
    else if (TempData["error"] != null) 
    { 
     message = TempData["error"].ToString(); 
     className = "error"; 
    } 

    <script> 
     $(document).ready(function() { 
      $('#flash').html('@HttpUtility.HtmlEncode(message)'); 
      $('#flash').toggleClass('@className'); 
      $('#flash').slideDown('slow'); 
      $('#flash').click(function() { $('#flash').toggle('highlight') }); 
     }); 
    </script> 
} 

इस प्रकार मैं

है
<section id="main"> 
    @Flash.Show() 
    <div id="flash" style="display: none"></div> 
    @RenderBody() 
</section> 

उत्तर

13

TempData ControllerBase वर्ग जो नियंत्रकों के लिए आधार वर्ग है के अंतर्गत आता है, यह करने के लिए सुलभ नहीं है साझा विचार जो कोई contr oller उनके पीछे है,

एक संभावित कामकाज नियंत्रक को आपके सहायक तरीके से पास करना या एचटीएमएलहेल्पर के माध्यम से इसे एक्सेस करना है।

@helper SomeHelper(HtmlHelper helper) 
{ 
    helper.ViewContext.Controller.TempData 
} 
+0

मैं एक सहायक http://stackoverflow.com/a/5582533/31470 धन्यवाद में हालांकि नहीं एक ही बात करने के लिए इस उत्तर का उपयोग करने के – eiu165

+0

Nonononono आप करते हैं एक -controller- पास करना चाहते हैं तो कृपया नहीं कर रहा था एक अवलोकन के लिए। आप फ़िल्टर को कैसे सेट अप करते हैं जो स्वचालित रूप से टेम्पैडाटा को दृश्य बैग में धक्का देता है? या डेटा के साथ व्यूबैग को पॉप्युलेट करने के लिए नियंत्रक बेस क्लास में OnActionExecut {ing, ed} विधियों का उपयोग करें। सीधे एक दृश्य के भीतर से नियंत्रक विधियों/फ़ील्ड/foo पोकिंग काफी ज्यादा encapsulation तोड़ता है। दो उदाहरणों के बीच अंतर यह है कि लिंक किया गया समाधान दृश्य में नियंत्रक का उपयोग नहीं करता है। – Cornelius

+0

अब आप सहायक का उपयोग कर सकते हैं। ViewContext.TempData। –

0

ऐसा लगता है कि आप TempData उपयोग कर रहे हैं जहाँ आप वास्तव में ViewBag या ViewData["key"] का उपयोग किया जा करना चाहते हैं।

नियंत्रक

ViewBag.info=someString; 
return View(model); 

देखें

if (ViewBag.info != null) 
{ 
    message = ViewBag.info; 
    className = "info"; 
} 

इस लेख चेक आउट: http://weblogs.asp.net/hajan/archive/2010/12/11/viewbag-dynamic-in-asp-net-mvc-3-rc-2.aspx

0

कुछ भी क्रम में TempData का उपयोग करने में मदद करने डेटा एक रीडायरेक्ट जीवित रहते हैं। अगर ऐसा है तो आपको पहले TempData के लिए डेटा बताए द्वारा आपकी समस्या का समाधान कर सकते हैं:

TempData["myStuff"] = myData; 

फिर अपना नया रीडायरेक्ट की कार्रवाई के अंदर:

ViewBag["myBaggedStuff"] = TempData["myStuff"]; 

फिर ViewBag अपने साझा दृश्य में इस्तेमाल करते हैं।

4

बस अपने सहायक में TempData पास करें।

आपके लेआउट में सहायक के लिए कॉल इस तरह दिखेगा।

@Flash.Show(TempData) 

आपका Flash.cshtml सहायक इस तरह दिखेगा।

@helper Show(System.Web.Mvc.TempDataDictionary tempData) 
{ 
    // The contents are identical to the OP's code, 
    // except change all instances of TempData to tempData. 
} 
संबंधित मुद्दे