Ogni volta che è necessario mostrare i dati (su qualsiasi oggetto o raccolta di oggetti) sulla vista, utilizzare una vista fortemente tipizzata.
Se il vostro punto di vista è puramente informativo, si può essere in grado di utilizzare il ModelState per passare piccole quantità di informazioni (ad esempio: pagine Successo/Errore, non autorizzati Messaggi, e così via)
Nelle mie applicazioni, I avere OGNI visualizzazione fortemente scritta, in modo che possa facilmente passare le informazioni di accesso dell'utente alla Pagina Master. Cioè, tutti i miei punti di vista sono fortemente tipizzati, su modelli e vincolata ad una classe di base che contiene la configurazione del sito e le informazioni Login utente.
A causa di ciò, posso fare questo:
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; } }
}
Nota che, dal momento che la pagina master è a tema sulla base di solo ciò che è popolato nel modello, la vista in sé non sarà mai innescare un colpo al database/cache.
MyBaseModel è configurato in questo 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; }
}
Il costruttore privato costringe tutte le sottoclassi di mio modello per inizializzare il modello con il controller laghetti L'alimento.
La classe di base del controller estrae l'utente dalla sessione e dalla cache di Config.
In questo modo, non importa cosa, tutti i miei punti di vista hanno accesso ai dati degli utenti e di configurazione, senza mai generare un colpo al DB.
Ora, in 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 { ... } }
}
Questo mi ha aiutato a trovare tutti i miei controller che tornavano viste che non sono stati ereditati dalla classe base appropriata.
Esattamente! Sono d'accordo. –