Nehmen wir an, wir haben eine ziemlich häufige ASP.NET MVC-Anwendung, wo eine Index.cshtml
Seite die Hauptseite ist, die GET
über Browsernavigation abgerufen wird und alle Methoden, die der Controller unterstützt, auf dieser Webseite abhängig von den Aktionen des Benutzers verwendet werden.Wird die URL der Aktionsmethode über das Ansichtsmodell als bewährte Methode übergeben?
Nun, innerhalb der Index.cshtml
Seite müssen wir URLs zu den Methoden generieren, die wir von unserem Controller verwenden möchten. Die Reihenfolge der meine Gedanken sind die folgenden: wird
- Standard MVC-Muster nur unter Verwendung von
Url.Action("actionName")
die offensichtlich schlechte Praxis ist: Zauber Saiten. Der nächste Schritt ist ein Weg, um es weniger Magie zu machen: sein kann, irgendeine Art von Erweiterungsmethoden verwenden, die uns, dies zu tun erlauben würde:
Url.Action<AdminController>(T => T.UploadData())
Welche auch schlecht, weil:
a) Razor nicht funktioniert sehr gut mit all diesen <> Klammern, die langsam Code Schreiben ergibt, fehlende Autoformat und Anforderung enthalten mehr
using
s über die Seite selbst oder `web.config‘ Dateib) Wenn eine Methode umbenannt wird, werden alle
.cshtml
Dateien wird nicht für diese Umbenennung überprüft (auf meinem PC, keine ReShaper oder was auch immer überprüft), so dass Sie Kompilierzeit (oder sogar Laufzeit, je nach den Einstellungen) Fehler haben.c) Sieht hässlich aus, wenn eine Methode, die Sie in URL konvertieren müssen, Parameter benötigt. Sie müssen einige Standardwerte für die Erweiterungsmethode angeben, und es wird noch komplizierter, wenn Sie tatsächlich echte Werte an einige dieser Parameter übergeben möchten, damit diese Werte in einer resultierenden URL angezeigt werden.
Schließlich, meine Idee: Wenn wir C# 6.0 jetzt mit seinem wunderbaren
nameof()
Stichwort haben, konnten wir alle erforderlichen Action-Urls von einem Controller zu jeder Ansicht über das Ansichtsmodell einesIndex
Aktion-Methode übergeben:class AdminController : Controller { public ViewResult Index() { return View(new AdminViewModel() { SomeData = new object(), ResetSettingsUrl = Url.Action(nameof(ResetSettings)) }); } [HttpPost] public void ResetSettings() { // Implementation. } }
Es ist/es: Sicherheit umbenennen, keine magischen Saiten, sehr leicht, keine Notwendigkeit für zusätzliche (Erweiterung) Code, keine Notwendigkeit für Controller-Namen an, ob der aktuelle wird eingesetzt.
Was halten Sie davon?
schreiben Ich wähle diese Frage als Wegthema zu schließen, weil die Abfrage von Meinungen und Start Diskussionen Wegthema ist für SO. – Amy
Sie könnten interessiert sein an [diese Frage und Antwort] (http://stackoverflow.com/questions/14359628/asp-net-mvc-action-methods-compile-time-errors-in-razor-cshtml-files) – Rob
Auch in Bezug auf 'Wenn eine Methode umbenannt wird, werden alle .cshtml-Dateien nicht auf diese Umbenennung überprüft. '- Nach meiner Erfahrung aktualisiert * resharper * .cshtml-Dateien. – Rob