Niepróbowane przeze mnie, ale możesz spojrzeć na rejestrację swoich widoków, a następnie ustawienie danych widoku podczas procesu aktywacji.
Ponieważ widoki są rejestrowane w locie, składnia rejestracji nie pomaga w łączeniu się z Activated
wydarzeniem, więc musisz skonfigurować je w 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";
};
}
}
}
To może być jedna z moich propozycji typu „jedyne narzędzie to młotek”; mogą istnieć prostsze sposoby z obsługą MVC, aby to osiągnąć.
Edycja: alternatywne, mniej kodujące podejście - po prostu dołącz do kontrolera
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>();
};
}
}
}
Edycja 2: Inne podejście, które działa bezpośrednio z kodu rejestracyjnego kontrolera:
builder.RegisterControllers(asm)
.OnActivated(e => {
dynamic viewBag = ((Controller)e.Instance).ViewBag;
viewBag.Config = e.Context.Resolve<Config>();
viewBag.Identity = e.Context.Resolve<IIdentity>();
});
Resolve
częśće.Context.Resolve
? Powinienem wspomnieć, że jestem przyzwyczajony do Ninject ...Najlepszym sposobem jest użycie ActionFilterAttribute. Pokażę ci, jak go używać w .Net Core i .Net Framework.
.Net Core 2.1 i 3.1
Następnie musisz to zarejestrować w swoim startup.cs.
.Net Core 3.1
.Net Core 2.1
Następnie możesz go używać we wszystkich widokach i na wszystkich stronach
.Net Framework (ASP.NET MVC .Net Framework)
zarejestruj swoją niestandardową klasę w globalnym. asax (Application_Start)
Następnie możesz go używać we wszystkich widokach
Jest też inny sposób
Tworzenie metody rozszerzającej w HtmlHelper
Następnie możesz go używać we wszystkich widokach
źródło
MembershipService
?Ponieważ właściwości ViewBag są z definicji powiązane z prezentacją widoku i dowolną logiką widoku światła, która może być konieczna, utworzyłbym podstawową WebViewPage i ustawiłbym właściwości podczas inicjalizacji strony. Jest bardzo podobny do koncepcji podstawowego kontrolera dla powtarzalnej logiki i typowych funkcji, ale dla twoich poglądów:
A następnie
\Views\Web.config
ustawpageBaseType
właściwość:źródło
ViewBag.Title
właściwość, a jedyną rzeczą we wspólnym układzie jest<title>@ViewBag.Title</title>
. To naprawdę nie byłoby odpowiednie dla czegoś takiego jak strona widoku aplikacji podstawowej, ponieważ każdy widok jest inny, a strona widoku podstawowego byłaby przeznaczona dla danych, które są naprawdę wspólne dla wszystkich widoków.Stanowisko Brandona jest tuż przy kasie. W rzeczywistości, chciałbym pójść o krok dalej i powiedzieć, że należy po prostu dodać wspólne obiekty jako właściwości tego WebViewPage bazowej , dzięki czemu nie trzeba przedmiotów odlewanych z ViewBag w każdym pojedynczym widoku. W ten sposób wykonuję konfigurację CurrentUser.
źródło
'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?)
Możesz użyć niestandardowego ActionResult:
Lub nawet ActionFilter:
Miał otwarty projekt MVC 2, ale obie techniki nadal mają zastosowanie z niewielkimi zmianami.
źródło
Nie musisz majstrować przy akcjach ani zmieniać modelu, po prostu użyj kontrolera podstawowego i rzutuj istniejący kontroler z kontekstu widoku układu.
Utwórz podstawowy kontroler z żądanymi wspólnymi danymi (tytuł / strona / lokalizacja itp.) I inicjalizacją akcji ...
Upewnij się, że każdy kontroler używa kontrolera podstawowego ...
Przerzuć istniejący kontroler podstawowy z kontekstu widoku na twojej
_Layout.cshml
stronie ...Teraz możesz odwoływać się do wartości w kontrolerze podstawowym ze strony układu.
źródło
Jeśli chcesz sprawdzać czas kompilacji i inteligencję dla właściwości w swoich widokach, ViewBag nie jest właściwym rozwiązaniem.
Rozważ klasę BaseViewModel i niech inne modele widoków dziedziczą z tej klasy, np .:
Podstawowy model widoku
Wyświetl określony ViewModel
Teraz kod widoku może uzyskać dostęp do właściwości bezpośrednio w widoku
źródło
Uważam, że następujące podejście jest najbardziej wydajne i zapewnia doskonałą kontrolę przy użyciu pliku _ViewStart.chtml i instrukcji warunkowych w razie potrzeby:
_ ViewStart :
Widok A :
Uwaga :
źródło