plantillas - ASP.NET MVC-Establecer ViewData para la página maestra en el controlador base
mvc layout templates (1)
Estoy usando una página maestra en mi proyecto ASP.NET MVC. Esta página maestra espera que algunos ViewData estén presentes, lo que muestra esto en cada página.
Si no configuro esta clave ViewData en mis controladores, recibo un error que no puede encontrarla. Sin embargo, no quiero configurar ViewData en todos los controladores (no quiero decir ViewData["foo"] = GetFoo();
en todos los controladores).
Por lo tanto, estaba pensando en configurar esto en un controlador base, y tengo todos los controladores heredados de este controlador base. En el constructur por defecto del controlador base, establezco el ViewData. Encontré un enfoque similar aquí: http://www.asp.net/learn/MVC/tutorial-13-cs.aspx. Hasta ahora todo bien, esto funciona ... pero el problema es que estos datos provienen de una base de datos en algún lugar.
Ahora, cuando quiero realizar una prueba unitaria de mis controladores, los que heredan del controlador base llaman a su constructor predeterminado. En el constructor predeterminado, inicializo mi clase de repositorio para obtener estos datos de la base de datos. Resultado: mis pruebas de unidad fallan, ya que no pueden acceder a los datos (y ciertamente no quiero que accedan a estos datos).
Tampoco quiero pasar la clase correcta de Repositorio (o DataContext, como se le llame) a cada controlador, que a su vez lo pasa al controlador predeterminado, que luego podría simularme con mis pruebas unitarias. Los controladores, a su vez, dependen de otras clases de repositorio, y yo terminaría pasando varios parámetros al constructor. ¿Demasiado trabajo para mi sentimiento, o me equivoco? ¿Hay otra solución?
He intentado usar StructureMap pero al final no sentí que eso iba a solucionar mi problema, ya que cada controlador todavía tendrá que llamar al constructor base que inicializará la clase de repositorio, así que no puedo burlarme de él.
This es una pregunta similar pero no encuentro una respuesta satisfactoria. ¿Puedo resolver esto de forma ordenada, tal vez utilizando StructureMap como solución? ¿O debería simplemente chuparlo y pasar un Repositorio a cada controlador y volver a pasarlo al controlador base? Nuevamente, se siente como mucho trabajo por algo tan simple. ¡Gracias!
Veo dos opciones:
Primero:
Establezca ViewData para MasterPage en YourBaseController.OnActionExecuting () o YourBaseController.OnActionExecuted ():
public class YourBaseController : Controller
{
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
// Optional: Work only for GET request
if (filterContext.RequestContext.HttpContext.Request.RequestType != "GET")
return;
// Optional: Do not work with AjaxRequests
if (filterContext.RequestContext.HttpContext.Request.IsAjaxRequest())
return;
...
filterContext.Controller.ViewData["foo"] = ...
}
}
Segundo:
O crear un filtro personalizado:
public class DataForMasterPageAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
// Optional: Work only for GET request
if (filterContext.RequestContext.HttpContext.Request.RequestType != "GET")
return;
// Optional: Do not work with AjaxRequests
if (filterContext.RequestContext.HttpContext.Request.IsAjaxRequest())
return;
...
filterContext.Controller.ViewData["foo"] = ...
}
}
y luego aplicar a sus controladores:
[DataForMasterPage]
public class YourController : YourBaseController
{
...
}
Creo que la segunda solución es exactamente para su caso.