2012-01-06 50 views
8

quisiera acceder al TempData en mi ayudante para un mensaje flash (como en rubí)uso TempData en un error de Ayudante: El nombre 'TempData' no existe en el contexto actual

consigo una error de ejecución de

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

mi Flash.cshtml es el siguiente

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

en el diseño tengo

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

Respuesta

13

TempData pertenece a ControllerBase clase que es la clase base para los controladores, que no es accesible a vistas compartidas que no tienen contr Oller está detrás de ellos,

Una posible solución es pasar el controlador a su método de ayuda o acceder a él a través de HtmlHelper.

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

yo era capaz de utilizar esta respuesta para hacer lo mismo, aunque no en un ayudante http://stackoverflow.com/a/5582533/31470 gracias – eiu165

+0

nonononono favor de que no quieres pasar una -controller- a -vista-. ¿Qué hay de configurar un filtro que empuje automáticamente TempData en la bolsa de visualización? O utilice los métodos OnActionExecut {ing, ed} en una clase base de controlador para rellenar la viewbag con los datos. Directamente empujando los métodos/campos/foo del controlador desde dentro de una vista casi rompe la encapsulación. La diferencia entre los dos ejemplos es que la solución vinculada no usa el controlador en la vista. – Cornelius

+0

Ahora puede usar helper.ViewContext.TempData. –

0

Algunos también usan TempData para ayudar a que los datos sobrevivan a una redirección. Si ese es el caso, puede solucionar el problema mediante la asignación de los primeros datos a TempData:

TempData["myStuff"] = myData; 

A continuación, dentro de su nueva acción reorientada:

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

A continuación, utilice ViewBag en su opinión compartida.

4

Solo pase TempData a su ayudante.

La llamada al ayudante en su diseño se verá así.

@Flash.Show(TempData) 

Su asistente Flash.cshtml se verá así.

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