Czy można określić, czy określona nazwa widoku istnieje z poziomu kontrolera przed renderowaniem widoku?
Mam wymaganie, aby dynamicznie określić nazwę widoku do renderowania. Jeśli istnieje widok o tej nazwie, muszę go wyrenderować. Jeśli nie ma widoku o niestandardowej nazwie, muszę renderować widok domyślny.
Chciałbym zrobić coś podobnego do następującego kodu w moim kontrolerze:
public ActionResult Index()
{
var name = SomeMethodToGetViewName();
// The 'ViewExists' method is what I've been unable to find.
if (ViewExists(name))
{
retun View(name);
}
else
{
return View();
}
}
asp.net-mvc
Andrew Hanson
źródło
źródło
Odpowiedzi:
Dla tych, którzy szukają metody rozszerzenia kopiuj / wklej:
źródło
A co z wypróbowaniem czegoś podobnego do następującego, zakładając, że używasz tylko jednego silnika widoku:
źródło
Oto inny (niekoniecznie zalecany) sposób na zrobienie tego
źródło
ControllerContext
jakFindView
potrzeby metod.Jeśli chcesz ponownie użyć tego w wielu akcjach kontrolera, opierając się na rozwiązaniu podanym przez Dave'a, możesz zdefiniować wynik widoku niestandardowego w następujący sposób:
Następnie w akcji po prostu zwróć instancję widoku niestandardowego:
źródło
Moje 2 centy.
źródło
W asp.net core 2.x
ViewEngines
właściwość już nie istnieje, więc musimy skorzystać zICompositeViewEngine
usługi. Oto wariant akceptowanej odpowiedzi przy użyciu wstrzykiwania zależności:Dla ciekawskich: interfejs podstawowy
IViewEngine
nie jest zarejestrowany jako usługa, więcICompositeViewEngine
zamiast tego musimy wstrzyknąć .FindView()
Metoda jest jednak zapewniaIViewEngine
więc zmienny element może używać interfejsu bazową.źródło
Oto jak to zrobić w Razor dla Core 2.2 itp. Zwróć uwagę, że wywołanie to „GetView”, a nie „Find View”)
źródło