Aufruf der Controller-Aktionsmethode direkt aus der Razor-Ansicht

8

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%     
James Wilson 03.04.2014, 16:14
quelle

4 Antworten

9

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. Vermeiden Sie es, die Methode aufzurufen, sondern fügen Sie die Daten in Ihr Modell ein und rendern Sie das Modell
  2. Verwenden Sie Html.RenderAction
  3. Fügen Sie die Methode in eine andere Klasse ein und verwenden Sie die normale Funktionssyntax.

(1) ist normalerweise mein Standardansatz, der oft DisplayTemplates und EditorTemplates

Für (3), z.B.

%Vor%

Und die Aussicht:

%Vor%     
Nathan 03.04.2014, 16:19
quelle
2

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.

    
StuartLC 03.04.2014 16:28
quelle
0

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.

    
Daniel Gimenez 03.04.2014 16:20
quelle
0

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:

%Vor%

Verwenden Sie die Hilfefunktionen asp-controller und asp-action auf dem Hyperlink.

    
MDMoore313 22.01.2018 03:42
quelle

Tags und Links