Cada vez que necesite mostrar datos (en cualquier objeto o conjunto de objetos en particular) en la vista, use una vista fuertemente tipada.
Si su visión es meramente informativa, es posible que pueda utilizar el ModelState para pasar pequeños trozos de información (por ejemplo: páginas Éxito/Error, no autorizados Mensajes, etc.) y
En mis aplicaciones, I tener CADA vista fuertemente tipada, para que pueda pasar fácilmente la información de inicio de sesión de usuario a la Página maestra. Es decir, todas mis vistas están fuertemente tipadas, modeladas y restringidas a una clase base que contiene la Configuración del sitio y la información de Inicio de sesión del usuario.
Debido a eso, puedo hacer esto:
public class MyBaseMasterPage : ViewMasterPage<MyBaseModel>
{
public string CurrentTheme
{
get
{
if (this.Model.CurrentUser != null)
return this.Model.CurrentUser.Theme;
else return this.Model.Config.DefaultTheme;
}
}
public User CurrentUser { get { return this.Model.CurrentUser; } }
public ConfigurationRepository Config { get { return this.Model.Config; } }
}
Tenga en cuenta que, desde la página maestra es temático basado en sólo lo que se rellena en el modelo, el propio Vista nunca va a desencadenar un golpe a la base de datos /cache.
MyBaseModel está configurado de este modo:
public class MyBaseModel
{
private MyBaseModel() { }
public MyBaseModel(MyBaseController controller)
{
this.CurrentUser = controller.CurrentUser;
this.Config = controller.Config;
}
public User CurrentUser { get; private set; }
public ConfigurationRepository Config { get; private set; }
}
El constructor privado obliga a todas las subclases de mi modelo para inicializar el modelo con el controlador cómoda de fuente.
La base de controlador clase saca al usuario de la sesión y la configuración de caché.
De esta manera, no importa qué, todas mis vistas tienen acceso a los datos de usuario y configuración, sin generar un golpe en la base de datos.
Ahora, en MyBaseController:
public class LanLordzBaseController : Controller
{
[Obsolete]
protected new ViewResult View(string viewName, object model)
{
if (model == null)
{
throw new ArgumentNullException("model");
}
if (!(model is MyBaseModel))
{
throw new ArgumentException("The model you passed is not a valid model.", "model");
}
return base.View(viewName, model);
}
protected ViewResult View(string viewName, MyBaseModelmodel)
{
if (model == null)
{
throw new ArgumentNullException("model");
}
return base.View(viewName, (object)model);
}
public ConfigurationRepository Config { get { ... } }
public User CurrentUser { get { ... } }
}
Esto me ayudó a encontrar todos mis controladores que regresaban puntos de vista que no se heredan de la clase base adecuada.
¡Exactamente! Estoy de acuerdo. –