Qual è il tuo modo di passare i dati alla pagina master (utilizzando ASP.NET MVC) senza infrangere le regole MVC?
Personalmente, preferisco codificare un controller astratto (controller di base) o una classe base che viene passata a tutte le viste.
Qual è il tuo modo di passare i dati alla pagina master (utilizzando ASP.NET MVC) senza infrangere le regole MVC?
Personalmente, preferisco codificare un controller astratto (controller di base) o una classe base che viene passata a tutte le viste.
Risposte:
Se preferisci che le tue visualizzazioni abbiano classi di dati di visualizzazione fortemente tipizzate, questo potrebbe funzionare per te. Altre soluzioni sono probabilmente più corrette ma questo è un buon equilibrio tra design e praticità IMHO.
La pagina master accetta una classe di dati di visualizzazione fortemente tipizzata contenente solo informazioni ad essa rilevanti:
public class MasterViewData
{
public ICollection<string> Navigation { get; set; }
}
Ogni visualizzazione che utilizza quella pagina master accetta una classe di dati di visualizzazione fortemente tipizzata contenente le sue informazioni e derivante dai dati di visualizzazione delle pagine master:
public class IndexViewData : MasterViewData
{
public string Name { get; set; }
public float Price { get; set; }
}
Dal momento che non voglio che i singoli controller sappiano nulla su come mettere insieme i dati delle pagine master, incapsulo quella logica in una fabbrica che viene passata a ciascun controller:
public interface IViewDataFactory
{
T Create<T>()
where T : MasterViewData, new()
}
public class ProductController : Controller
{
public ProductController(IViewDataFactory viewDataFactory)
...
public ActionResult Index()
{
var viewData = viewDataFactory.Create<ProductViewData>();
viewData.Name = "My product";
viewData.Price = 9.95;
return View("Index", viewData);
}
}
L'ereditarietà corrisponde al master per visualizzare bene la relazione, ma quando si tratta di rendering di parziali / controlli utente comporrò i loro dati di visualizzazione nei dati di visualizzazione delle pagine, ad es.
public class IndexViewData : MasterViewData
{
public string Name { get; set; }
public float Price { get; set; }
public SubViewData SubViewData { get; set; }
}
<% Html.RenderPartial("Sub", Model.SubViewData); %>
Questo è solo un esempio di codice e non deve essere compilato così com'è. Progettato per ASP.Net MVC 1.0.
Preferisco suddividere le parti guidate dai dati della vista principale in parziali e renderle utilizzando Html.RenderAction . Ciò presenta diversi vantaggi distinti rispetto al popolare approccio di ereditarietà del modello di visualizzazione:
MODIFICARE
L'errore generico ha fornito una risposta migliore di seguito. Per favore leggilo!
Risposta originale
Microsoft ha effettivamente pubblicato una voce sul modo "ufficiale" di gestire questa situazione. Ciò fornisce una guida dettagliata con una spiegazione del loro ragionamento.
In breve, raccomandano di usare una classe controller astratta, ma guarda tu stesso.
Ho fatto delle ricerche e mi sono imbattuto in questi due siti. Forse potrebbero aiutare.
Suggerimento # 31 di ASP.NET MVC: passaggio di dati a pagine master e controlli utente
Trovo che un genitore comune per tutti gli oggetti del modello che passi alla vista sia eccezionalmente utile.
In ogni caso, ci saranno sempre alcune proprietà di modello comuni tra le pagine.
L'oggetto Request.Params è modificabile. È abbastanza facile aggiungere valori scalari come parte del ciclo di elaborazione delle richieste. Dal punto di vista della visualizzazione, tali informazioni avrebbero potuto essere fornite in QueryString o FORM POST. hth
Penso che un altro buon modo potrebbe essere quello di creare l'interfaccia per la visualizzazione con alcune proprietà come ParentView di alcune interfacce, in modo da poterlo utilizzare sia per i controlli che richiedono un riferimento alla pagina (controllo padre) sia per le viste principali a cui si dovrebbe accedere da visualizzazioni.
Le altre soluzioni mancano di eleganza e richiedono troppo tempo. Mi scuso per aver fatto questa cosa molto triste e impoverita quasi un anno intero dopo:
<script runat="server" type="text/C#">
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
MasterModel = SiteMasterViewData.Get(this.Context);
}
protected SiteMasterViewData MasterModel;
</script>
Quindi chiaramente ho questo metodo statico Get () su SiteMasterViewData che restituisce SiteMasterViewData.