Kann vor dem Rendern der Ansicht festgestellt werden, ob in einem Controller ein bestimmter Ansichtsname vorhanden ist?
Ich muss den Namen der zu rendernden Ansicht dynamisch bestimmen. Wenn eine Ansicht mit diesem Namen vorhanden ist, muss ich diese Ansicht rendern. Wenn es keine Ansicht mit dem benutzerdefinierten Namen gibt, muss ich eine Standardansicht rendern.
Ich möchte etwas Ähnliches wie den folgenden Code in meinem Controller tun:
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
quelle
quelle
Antworten:
Für diejenigen, die eine Erweiterungsmethode zum Kopieren / Einfügen suchen:
quelle
Wie wäre es, wenn Sie Folgendes ausprobieren, vorausgesetzt, Sie verwenden nur eine Ansichts-Engine:
quelle
Hier ist eine andere [nicht unbedingt empfohlene] Möglichkeit, dies zu tun
quelle
ControllerContext
wie es dieFindView
Methode benötigt.Wenn Sie dies auf der Grundlage der von Dave angegebenen Lösung für mehrere Controller-Aktionen wiederverwenden möchten, können Sie ein benutzerdefiniertes Ansichtsergebnis wie folgt definieren:
Geben Sie dann in Ihrer Aktion einfach eine Instanz Ihrer benutzerdefinierten Ansicht zurück:
quelle
Meine 2 Cent.
quelle
In asp.net core 2.x ist die
ViewEngines
Eigenschaft nicht mehr vorhanden, daher müssen wir denICompositeViewEngine
Dienst verwenden. Dies ist eine Variante der akzeptierten Antwort mit Abhängigkeitsinjektion:Für Neugierige: Die Basisschnittstelle
IViewEngine
ist nicht als Dienst registriert, daher müssen wirICompositeViewEngine
stattdessen injizieren . DieFindView()
Methode wird jedoch bereitgestellt,IViewEngine
damit die Mitgliedsvariable die Basisschnittstelle verwenden kann.quelle
Hier erfahren Sie, wie Sie dies in Razor für Core 2.2 usw. tun. Beachten Sie, dass der Aufruf "GetView" und nicht "Find View" lautet.
quelle