Ich schaute mich um und konnte keine einfache Lösung finden.
Ich habe @GetUserName
ausprobiert, was nicht funktioniert.
Ich habe @ { GetUserName
ausprobiert, was nicht funktioniert.
Es muss einen einfachen Weg geben, eine Methode von der Rasiereransichtsmaschine aufzurufen.
Es befindet sich in einer foreach
Schleife.
Ich brauche GetUserName(item.userID)
Der folgende Code ist in meinem Controller:
%Vor%Der Versuch, eine Controller-Aktionsmethode direkt aus Ihrer Sicht aufzurufen, ist normalerweise ein Zeichen für schlechtes Design.
Je nachdem, was Sie versuchen, haben Sie einige Optionen:
(1) ist normalerweise mein Standardansatz, der oft DisplayTemplates und EditorTemplates
Für (3), z.B.
%Vor%Und die Aussicht:
%Vor%Obwohl Sie die Controller-Instanz aus Ihrer Sicht beziehen können, ist dies völlig falsch, da sie gegen das gesamte MVC- (und MVVM-) Paradigma verstößt, da die Ansicht ihren Controller nicht kennen sollte / p>
(Der einzige mögliche Grund, warum ich darüber nachdenken könnte, wo dies nützlich wäre, wäre vielleicht, den Controller aus einer verspotteten Sicht zu testen, obwohl es auch hier möglich sein sollte, die exponierte Controller-Funktionalität direkt aus Komponententests zu testen):
%Vor% Der beste Weg, zu diesem Ergebnis zu gelangen, ist, dass der Controller vorbelegt wird und übergeben alle Daten, die von View
benötigt werden, wie z. B. userName
, an eine benutzerdefinierte ViewModel
(wie von der Direktive @model
bei oben auf der Razor-Seite) oder auf die ViewBag
dynamic.
Das offensichtliche Problem, das Sie haben, ist, dass der UserName als Teil des Modells oder zumindest im ViewBag eingefügt werden sollte.
%Vor%Okay, aber lassen Sie uns aus irgendeinem verrückten Grund sagen, dass Sie die Benutzerkennung zu diesem Zeitpunkt nicht haben. Dann können Sie diese Methode in einer Klasse außerhalb Ihres Controllers verwenden und in Ihrer Ansicht eine Instanz erstellen.
%Vor%Es passiert zwar, aber Sie möchten alle Ihre Daten in Ihrem Modell haben und diese zu Ihrer Ansicht senden. Ihre Ansicht sollte nur zum Anzeigen der Daten dienen und sollte zum Abrufen von Informationen aus Datenbanken führen.
Andere Antworten sagen, dass es eine schlechte Übung ist; Wie bei den meisten Dingen hängt das davon ab, wie Sie es verwenden.
Das freigegebene Layout von Microsoft als Teil der MVC-Vorlage, _LoginPartial.cshtml
ruft die Methoden SignIn
und SignOut
auf dem Controller direkt aus der Ansicht auf:
Verwenden Sie die Hilfefunktionen asp-controller
und asp-action
auf dem Hyperlink.
Tags und Links asp.net-mvc c# razor