2010-10-27 5 views
7

Also, wenn es einen globalen Status gibt, den jede Ansicht einer MVC-Anwendung rendern muss ... zum Beispiel: IsUserLoggedOn und UserName ... was ist der geeignete Weg, diese Informationen zu jeder Ansicht zu bekommen?ASP.NET MVC: Wie behandelt man Modelldaten, die zu jeder Ansicht gehen müssen?

Ich verstehe, dass dieser Teil der Ansicht in der Masterseite oder in einer Teilansicht sein sollte, die zu den anderen Ansichten hinzugefügt wird. Aber was ist eine gute Möglichkeit sicherzustellen, dass die globalen Modelldaten jedes Mal von allen relevanten Controllern und Aktionen an die View übergeben werden?

Antwort

6

Danach gefragt, fand ich diese gute Blog-Post von Steve Sanderson : http://blog.stevensanderson.com/2008/10/14/partial-requests-in-aspnet-mvc/

Er schlägt drei verschiedene vor Ansätze:

  • eine Basis Controller-Klasse oder Action Verwenden Sie das entsprechende Modell in die ViewData[] Sammlung jedes Mal hinzuzufügen. Ich denke, ein paar Leute haben das schon vorgeschlagen.

  • Verwenden Html.RenderAction() in der Ansicht ... und, wie er sagt:

Wenn jemand Ihnen sagt, dass interne Unteranfragen schlecht sind, weil es „ist nicht MVC“, dann beißen einfach sie auf das Gesicht sofort. Fragen Sie sie auch , warum sie immer noch bereit sind, Ajax, und sogar <IMG> Tags für diese Angelegenheit, vorausgesetzt, dass beide eine Form von Unteranforderung sind.

  • Use ‚Partial Anfragen‘ (er gibt den Code für diesen auf his blog), die an andere Steuerungen in eine verschachtelte sortof ViewData Struktur einer Steuerung zu verschachteln Anrufe zulassen.
+0

+1 RenderAction ist der Weg zu gehen. Hält nette SRP – redsquare

3

codeulike - siehe die Antwort auf eine ähnliche Frage an genau der gleichen Zeit wie diese gestellt:

ASP.NET MVC displaying user name from a Profile

auf den Punkt gebracht, im Grunde eine Basis-Controller erstellen, die von allen anderen Controllern geerbt hat. Der Basis-Controller hat dann eine Override-Funktion, die Thro 'an alle' untergeordneten 'Controller überträgt. anstatt den Code zu duplizieren, oben einen Blick auf meine Antwort nehmen und es zu versuchen ..

prost ...

2

Sie Basisklasse für Ansichtsmodell erstellen können, die gemeinsam genutzte Informationen enthält und dass für jedes Viewmodel erben.

public class ViewModelBase 
{ 
    // shared data 
} 
public class Page1ViewModel : ViewModelBase 
{ 
    // page 1 data 
} 

In MasterpaDE Sie, dass Basisklasse verwenden könnten

Inherits="System.Web.Mvc.ViewMasterPage<ViewModelBase>" 

und in jeder Ansicht verwenden, um diese abgeleiteten Klassen

Inherits="System.Web.Mvc.ViewPage<Page1ViewModel>" 
+0

Richtig, aber wie bevölkere ich dieses Viewmodel jedes Mal? Vermutlich mit einem Basiscontroller, oder? – codeulike

+0

ViewModelBase Konstruktor/Hilfsklasse/Controller Basisklasse –