Laden...

[erledigt] MVC 3 und Strongly Typed Actionlink

Erstellt von squadwuschel vor 12 Jahren Letzter Beitrag vor 12 Jahren 2.845 Views
S
squadwuschel Themenstarter:in
406 Beiträge seit 2007
vor 12 Jahren
[erledigt] MVC 3 und Strongly Typed Actionlink

Hallo,

Ich habe im Netz bereits danach gesucht bin aber nicht ganz schlau aus der Materie geworden,
denn ich möchte gern im view folgendes verwenden:

@(Html.ActionLink<ControllerName>(a=>a.Index(),"Login"))

Als View Engine nutze ich razor und ich dachte ab MVC 3 werden strongly typed Links nativ unterstützt, denn leider erkennt er bei mir die Syntax nicht an. Muss man hier noch ein Plugin installieren oder was übersehe ich hier genau?

Thx much
Squadwuschel

Mein Blog über .NET und MVC / EF | Meine kostenlose Onlinearbeitszeitverwaltung My:Worktime

S
417 Beiträge seit 2008
vor 12 Jahren

Hallo,

ich denke dazu brauchst du die MvcContrib (Strongly Typed RedirectToAction).

1.002 Beiträge seit 2007
vor 12 Jahren

Hallo squadwuschel,

zur Zeit unterstützt MVC stark typisierte Action Links noch nicht out of the box.
Da mir allerdings genau die Funktionalität fehlt, habe ich auf der entsprechenden UserVoice-Seite, die Scott Hanselman letzte Woche angelegt hat, einen Feature Request Introduce strongly-typed HtmlHelper / UrlHelper methods erstellt — es wäre schön, wenn jeder, der Interesse daran hat, 3 Stimmen dafür abgeben würde!

m0rius

Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg

16.834 Beiträge seit 2008
vor 12 Jahren

Hi,

ihr müsst euch aber im Klaren sein, dass solche Links nichts für große oder Performance-orientierte Applikationen sind.
Selbst Url.Action ist 8 mal langsamer als der direkte Zugriff auf definierte Routen (Url.RouteUrl) in den RouteTables..

S
squadwuschel Themenstarter:in
406 Beiträge seit 2007
vor 12 Jahren

Hio,

Danke für die Antworten 😃

Abt -> was meinst du mit dem direkten Zugriff auf definierte Routen in den RouteTables?

thx squadwuschel

Mein Blog über .NET und MVC / EF | Meine kostenlose Onlinearbeitszeitverwaltung My:Worktime

16.834 Beiträge seit 2008
vor 12 Jahren

Alles was dynamisch ist, ist langsam.

  • Die Verwendung von new RouteValueDictionary{{"action", "MyAction"}} ist deutlich schneller als new { "action" = "MyAction" }

  • Routen in den RouteTables zu definieren und via Url.RouteUrl("RouteName") zuzugreifen ist die schnellste Möglichkeit einen Link zu generieren. Ausnahme ist hier wieder die Verwendung von new {...} für Parameter in Zusammenhang mit der default-url.

Und wir sprechen hier halt nich von ein paar ns, sondern von einigen ms pro generierten Link, was auf einer Hauptseite jede Menge sein kann!
Die Generierung von Links über Expressions, wie Du es hier von MVC forderst, ist die aller aller langsamste - mit Abstand 😉
ASP.NET MVC Performance Slide 25 zeigt das auch sehr schön.

S
squadwuschel Themenstarter:in
406 Beiträge seit 2007
vor 12 Jahren

Sehr coole slides

Danke dir, sehr nice. Naja im Moment verwende ich enums mit toString() in meinen generierten Links um etwas Sicherheit zu haben wenn sich Linknamen ändern. Dann werde ich es mal dabei belassen 😃

Thx squadwuschel

Mein Blog über .NET und MVC / EF | Meine kostenlose Onlinearbeitszeitverwaltung My:Worktime

16.834 Beiträge seit 2008
vor 12 Jahren

ENUMs in Linknamen?!
Und damit fütterst Du was? Die RouteTables?

S
squadwuschel Themenstarter:in
406 Beiträge seit 2007
vor 12 Jahren

Hio,

Nein Route tables nutze ich nicht.

Ich nehme z.B. ActionLink und nehme dort für den controllernamen einen enum Value den ich zu toString umwandle damit ich keine reinen Strings verwenden muss, ausserdem habe ich für jeden Controller ein eigenes enum. Denn ich halte es für zu fehleranfällig einfache Strings zu verwenden und vor allem wenn sich etwas ändert ist das ganze weniger fehleranfällig.

Oder wie handhabst du das?

Thx squadwuschel

Mein Blog über .NET und MVC / EF | Meine kostenlose Onlinearbeitszeitverwaltung My:Worktime

16.834 Beiträge seit 2008
vor 12 Jahren

Hi,

da ich sehr auf die Performance achte habe ich nur Named Routes; sprich ich arbeite mit der RouteTable.


            context.MapRoute(
                "Benutzer_Uebersicht",
                "Mandanten/{mandant}/Benutzer",
                new { controller = "Benutzer", action = "Index" }
             );

            context.MapRoute(
                "Benutzer_Erstellen",
                "Mandanten/{mandant}/Benutzer/Erstellen",
                new { controller = "Benutzer", action = "Erstellen" }
            );

            context.MapRoute(
                "Benutzer_Bearbeiten",
                "Mandanten/{mandant}/Benutzer/{benutzer}/Bearbeiten",
                new { controller = "Benutzer", action = "Bearbeiten" }
             );

Und dann eben mit

Url.RouteUrl( "Benutzer_Bearbeiten", new RouteValueDictionary{ { "mandant", "myCSHarp" }, { "benutzer", "Abt" } } );

arbeiten.
Damit ist dann auch die Sache mit den ASP.NET MVC UrlRouting - Schöne Urls gelöst. Ebenso ist ein einfache Lokalisierung möglich.

Schneller als das ist nur noch string.Format().

Gruß

S
squadwuschel Themenstarter:in
406 Beiträge seit 2007
vor 12 Jahren

danke dir für deine ausführliche Antwort, sehr nice.

thx squadwuschel

Mein Blog über .NET und MVC / EF | Meine kostenlose Onlinearbeitszeitverwaltung My:Worktime