Magische Zeichenfolgen in ASP.NET MVC

8

Ich habe einen Hintergrund in der Desktop-Software-Entwicklung und bin dabei, ASP.NET MVC zu lernen.

In meiner Standard HomeController habe ich die Index-Aktion, die Code hat, der so aussieht:

%Vor%

Mit anderen Worten, leiten Sie den Benutzer zu "/ account / login" um. Die AccountController.Login Aktion wird dann den Benutzer behandeln und ihn nach erfolgreicher Anmeldung an den HomeController zurücksenden.

Dieser Code riecht nach mir, vielleicht nur weil ich daran gewöhnt bin, Dinge in der Desktop-Software anders zu machen. Was passiert, wenn ich den Namen der Login-Aktion in "LogOn" ändere? Was passiert, wenn ich den AccountController komplett entferne und ihn durch etwas anderes ersetze? Ich werde einen neuen Fehler einführen, aber ich werde keine Compiler-Fehler bekommen, und meine Unit-Tests werden es wahrscheinlich auch nicht verstehen. Da ich Strings verwendet habe, um Controller- und Action-Namen anzugeben, bietet das Refactoring und Redesign mehr Möglichkeiten, den Code überall zu durchbrechen.

Was ich möchte, ist etwa so:

%Vor%

Ich bin mir jedoch nicht sicher, ob das überhaupt möglich ist oder ob es der beste Weg ist.

Bin ich dumm oder haben andere Leute das gleiche Problem? Was machst du, um es zu umgehen?

    
Phil 03.12.2011, 21:16
quelle

7 Antworten

20

Ich denke, wonach Sie suchen, ist der Grund, warum T4MVC existiert - es entfernt alle die "Magic Strings", die sich auf Controller und Aktionen beziehen und diese durch Klassen und Eigenschaften ersetzen.

Mit T4MVC, das

%Vor%

wird dies

%Vor%

Es gibt ein Flag, das in den T4MVC-Einstellungen gesetzt werden kann, um zu erzwingen, dass die Vorlage bei jedem Build ausgeführt wird. So können Sie frühzeitig warnen, wenn sich etwas geändert hat.

Obwohl Sie nicht danach gefragt haben, können Sie die AuthorizeAttribute um zu verhindern, dass die Anforderung in Ihrer Controller-Aktion authentifiziert wird.

das

%Vor%

wird

%Vor%

Dann in web.config , setze die URL so, dass sie auf die Konto-Login-URL zeigt

%Vor%

Zugegeben, dies gibt Ihnen keine Sicherheit, wenn sich Ihre Controller und Aktionen ändern (ähnlich wie bei Ihrer ursprünglichen Beschwerde), aber Sie können immer eine Route einrichten, um die ausgewählte URL an die richtige Steuerung und Aktion zu leiten und das T4MVC zu verwenden generierte Klassen in der Route, die Sie mit einer Kompilierzeitwarnung versehen, wenn sich die Dinge geändert haben.

    
Russ Cam 03.12.2011, 21:20
quelle
4

Sie können Ihre eigenen benutzerdefinierten Erweiterungsmethoden schreiben, um magische Strings zu vermeiden. Zum Beispiel können Sie meine Implementierung hier sehen: Ссылка Beachten Sie, dass dies ein wenig Performance-Overhead-Laufzeit hinzufügt, die Sie lösen können, indem Sie alle Links zwischenspeichern. Wenn Sie die Kompilierzeit überprüfen möchten, ist T4MVC Ihre Lösung: Ссылка

    
Ивайло Кенов 03.06.2015 07:29
quelle
3

Ich weiß, dass es nicht wirklich eine Antwort ist, aber ein Werkzeug wie Resharper zu verwenden, kann dir helfen, das auch zu lösen. Resharper verfolgt die Controller und Aktionen und gibt eine Warnung aus, wenn eine magische Zeichenfolge, die eigentlich ein Controller sein soll, keine ist. Es funktioniert jedoch nur mit Standardmethoden wie RedirectToAction oder ActionLink.

Bearbeiten: Anscheinend können Sie Anmerkungen hinzufügen, um mit den benutzerdefinierten Erweiterungsmethoden arbeiten zu können. Siehe hier .

    
Carles Company 03.12.2011 21:37
quelle
3

In C # 6 können Sie nameof nutzen und viele davon einfach umgestalten magische Saiten.

%Vor%     
Shoe 01.02.2016 22:10
quelle
1

Russ 'Antwort ist direkt auf das Geld, aber es geht nicht wirklich auf deine Bedenken ein. Das ist wirklich "Warum gibt es magische Fäden in MVC?".

In früheren Versionen von MVC war es eigentlich ganz anders. Sie benutzten die magischen Zeichenfolgen nicht und hatten mehr typbasierte Methoden. Dies wurde jedoch aus einer Reihe von Gründen geändert. Ich habe die Details vergessen, aber es gab logische Gründe für diese ansonsten merkwürdige Rückkehr zu nicht-sicheren Methoden.

Ich erinnere mich, dass es etwas damit zu tun hatte, wie MVC mehrere Bereiche nach übereinstimmenden Konventionen durchsucht, und dies war mit Strings viel einfacher zu erreichen als typisierte Objekte. Dies gilt insbesondere für Views und Partials.

Vielleicht kann sich jemand erinnern, der sich an die Details erinnert.

    
Erik Funkenbusch 04.12.2011 07:19
quelle
0

Als eine Alternative zu T4MVC habe ich einen kleinen Helfer geschrieben, der es Ihnen ermöglicht, ziemlich genau Ihre vorgeschlagene Syntax zu verwenden und ohne den automatisch generierten Code:

%Vor%

Und in der Steuerung:

%Vor%

Meine Lösung funktioniert zur Laufzeit, was T4MVC zur Build-Zeit tut.

Es gibt ein NuGet-Paket und ein GitHub-Projekt .

    
John 03.11.2014 16:13
quelle
0

Wenn Sie wirklich nur daran interessiert sind, auf Aktionen und Controller umzuleiten, ist der Operator C # 6 nameof wirklich hilfreich - bis Sie zwischen den Controllern umleiten müssen. Am Ende habe ich eine Utility-Methode geschrieben, um den Controller-Namen zu erhalten:

%Vor%

Und Sie können es so verwenden:

%Vor%     
johnnyRose 19.09.2016 00:42
quelle