2012-01-06 8 views
8

Vorrei accedere al TempData in mio aiuto per un messaggio flash (come in Ruby)uso TempData un errore di Helper: Il nome 'TempData' non esiste nel contesto corrente

ho un errore di runtime di

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

mia Flash.cshtml è la seguente

@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> 
} 

nel layout ho

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

risposta

13

TempData appartiene alla ControllerBase classe che è classe base per i controller, non è accessibile a opinioni condivise che non contr è dietro di loro,

Una possibile soluzione è passare il controller al metodo di supporto o accedervi tramite HtmlHelper.

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

ero in grado di utilizzare questa risposta per fare la stessa cosa anche se non in un aiutante http://stackoverflow.com/a/5582533/31470 grazie – eiu165

+0

Nonononono si prega di non si vuole passare un -controller- a un -view-. Che ne dici di impostare un filtro che spinge automaticamente il TempData nel view bag? In alternativa, utilizzare i metodi OnActionExecut {ing, ed} in una classe di base del controller per popolare il viewbag con i dati. Il controllo diretto dei metodi/campi/foo del controllore da una vista interrompe praticamente l'incapsulamento. La differenza tra i due esempi è che la soluzione collegata non utilizza il controller nella vista. – Cornelius

+0

Ora è possibile utilizzare helper.ViewContext.TempData. –

0

Alcuni usano anche TempData per aiutare i dati a sopravvivere a un reindirizzamento. Se questo è il caso si può risolvere il problema in primo luogo classificare i dati relativi a TempData:

TempData["myStuff"] = myData; 

Poi all'interno della vostra nuova un'azione riorientata:

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

Quindi utilizzare ViewBag nella vista condiviso.

4

Basta passare TempData al proprio assistente.

La chiamata all'helper nel layout sarà simile a questa.

@Flash.Show(TempData) 

L'helper di Flash.cshtml sarà simile a questo.

@helper Show(System.Web.Mvc.TempDataDictionary tempData) 
{ 
    // The contents are identical to the OP's code, 
    // except change all instances of TempData to tempData. 
}