2016-05-16 18 views
1

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

  1. Standard MVC-Muster nur unter Verwendung von Url.Action("actionName") die offensichtlich schlechte Praxis ist: Zauber Saiten.
  2. 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‘ Datei

    b) 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.

  3. 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 eines Index 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?

+1

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

+0

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

+0

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

Antwort

0

Ich denke, T4MVC ist das, was Sie suchen:

T4MVC ist ein T4-Vorlage für ASP.NET MVC-Anwendungen, die stark Helfer getippt, die die Verwendung von Zeichenketten in vielen Orte beseitigen schafft.

z.B.statt

@Html.ActionLink("Delete Dinner", "Delete", "Dinners", new { id = Model.DinnerID }, null) 

T4MVC können Sie

@Html.ActionLink("Delete Dinner", MVC.Dinners.Delete(Model.DinnerID)) 
+0

Der Autor erwähnt in seinem Video, dass es ohne ReSharper immer noch keine Refactoring-Unterstützung in den Ansichten gibt, wenn Sie die Aktionsmethode auf dem Controller umbenennen. Aber danke, ich werde es überprüfen! – AgentFire

+0

Es zwingt auch Ihre Controller NICHT versiegelt werden. – AgentFire

+0

Und zwingt auch Ihre Controller-Methoden, virtuell zu sein. – AgentFire