Von mir nicht ausprobiert, aber Sie könnten versuchen, Ihre Ansichten zu registrieren und dann die Ansichtsdaten während des Aktivierungsprozesses festzulegen.
Da Ansichten im laufenden Betrieb registriert werden, hilft Ihnen die Registrierungssyntax beim Herstellen einer Verbindung zum Activated
Ereignis nicht. Sie müssen sie daher wie folgt einrichten Module
:
class SetViewBagItemsModule : Module
{
protected override void AttachToComponentRegistration(
IComponentRegistration registration,
IComponentRegistry registry)
{
if (typeof(WebViewPage).IsAssignableFrom(registration.Activator.LimitType))
{
registration.Activated += (s, e) => {
((WebViewPage)e.Instance).ViewBag.Global = "global";
};
}
}
}
Dies könnte einer der Vorschläge vom Typ "Nur ein Werkzeug ist ein Hammer" von mir sein. Möglicherweise gibt es einfachere MVC-fähige Möglichkeiten, um darauf zuzugreifen.
Bearbeiten: Alternativer Ansatz mit weniger Code - einfach an den Controller anschließen
public class SetViewBagItemsModule: Module
{
protected override void AttachToComponentRegistration(IComponentRegistry cr,
IComponentRegistration reg)
{
Type limitType = reg.Activator.LimitType;
if (typeof(Controller).IsAssignableFrom(limitType))
{
registration.Activated += (s, e) =>
{
dynamic viewBag = ((Controller)e.Instance).ViewBag;
viewBag.Config = e.Context.Resolve<Config>();
viewBag.Identity = e.Context.Resolve<IIdentity>();
};
}
}
}
Edit 2: Ein weiterer Ansatz, der direkt vom Controller-Registrierungscode aus funktioniert:
builder.RegisterControllers(asm)
.OnActivated(e => {
dynamic viewBag = ((Controller)e.Instance).ViewBag;
viewBag.Config = e.Context.Resolve<Config>();
viewBag.Identity = e.Context.Resolve<IIdentity>();
});
Nicholas Blumhardt
quelle
Resolve
Teil vone.Context.Resolve
? Ich sollte erwähnen, dass ich an NinjectAm besten verwenden Sie ActionFilterAttribute und registrieren Ihre benutzerdefinierte Klasse in Ihrer globalen Klasse. asax (Application_Start)
Registrieren Sie Ihre benutzerdefinierte Klasse in Ihrem globalen. asax (Application_Start)
Dann können Sie es in allen Ansichten verwenden
Es gibt auch einen anderen Weg
Erstellen einer Erweiterungsmethode in HtmlHelper
Dann können Sie es in allen Ansichten verwenden
quelle
MembershipService
?Da ViewBag-Eigenschaften per Definition an die Ansichtspräsentation und die möglicherweise erforderliche Light-View-Logik gebunden sind, würde ich eine Basis-WebViewPage erstellen und die Eigenschaften bei der Seiteninitialisierung festlegen . Es ist dem Konzept eines Basis-Controllers für wiederholte Logik und allgemeine Funktionalität sehr ähnlich, aber für Ihre Ansichten:
Und dann
\Views\Web.config
setzen Sie in diepageBaseType
Eigenschaft:quelle
ViewBag.Title
Eigenschaft festlegt, und dann ist das einzige, was im freigegebenen Layout ist<title>@ViewBag.Title</title>
. Es wäre nicht wirklich für so etwas wie eine Basisanwendungsansichtseite geeignet, da jede Ansicht unterschiedlich ist, und die Basisansichtseite wäre für Daten gedacht, die wirklich für alle Ansichten gleich sind.Brandons Post ist genau richtig. In der Tat würde ich noch einen Schritt weiter gehen und sagen, dass Sie nur Ihre allgemeinen Objekte als Eigenschaften der Basis-WebViewPage hinzufügen sollten, damit Sie nicht in jeder einzelnen Ansicht Elemente aus dem ViewBag umwandeln müssen. Ich mache mein CurrentUser-Setup auf diese Weise.
quelle
'ASP._Page_Views_Shared__Layout_cshtml' does not contain a definition for 'MyProp' and no extension method 'MyProp' accepting a first argument of type 'ASP._Page_Views_Shared__Layout_cshtml' could be found (are you missing a using directive or an assembly reference?)
Sie können ein benutzerdefiniertes ActionResult verwenden:
Oder sogar ein ActionFilter:
Hatte ein MVC 2-Projekt geöffnet, aber beide Techniken gelten immer noch mit geringfügigen Änderungen.
quelle
Sie müssen sich nicht mit Aktionen herumschlagen oder das Modell ändern, sondern nur einen Basis-Controller verwenden und den vorhandenen Controller aus dem Kontext der Layoutansicht umwandeln.
Erstellen Sie einen Basis-Controller mit den gewünschten gemeinsamen Daten (Titel / Seite / Speicherort usw.) und der Aktionsinitialisierung ...
Stellen Sie sicher, dass jeder Controller den Basis-Controller verwendet ...
Übertragen Sie den vorhandenen Basis-Controller aus dem Ansichtskontext auf Ihrer
_Layout.cshml
Seite ...Jetzt können Sie auf Ihrer Layoutseite auf Werte in Ihrem Basis-Controller verweisen.
quelle
Wenn Sie die Überprüfung der Kompilierungszeit und Intellisense für die Eigenschaften in Ihren Ansichten wünschen, ist der ViewBag nicht der richtige Weg.
Stellen Sie sich eine BaseViewModel-Klasse vor und lassen Sie Ihre anderen Ansichtsmodelle von dieser Klasse erben, z.
Basis-ViewModel
Spezifisches ViewModel anzeigen
Jetzt kann der Ansichtscode direkt in der Ansicht auf die Eigenschaft zugreifen
quelle
Ich habe festgestellt, dass der folgende Ansatz am effizientesten ist und eine hervorragende Kontrolle unter Verwendung der Datei _ViewStart.chtml und der erforderlichen bedingten Anweisungen bietet:
_ ViewStart :
ViewA :
Hinweis :
quelle