2016-06-09 8 views
0

Ich möchte alle Instanzen von UrlHelper.Action mit UrlHelper.RouteUrl in meinem Code wegen der performance benefits ersetzen. Laut der Dokumentation werden beide Methoden eine voll qualifizierte URL generieren, ich möchte bestätigen, dass sie die genaue URL zurückgeben werden.Ist UrlHelper.Action äquivalent zu UrlHelper.RouteUrl?


Beispiel:

Unter der Annahme, dass die Routen in RouteConfig haben einzigartige controller, action Kombinationen:

die folgende Route in RouteConfig Gegeben:

routes.MapRoute(
    "RouteName", 
    "Url", 
    new { controller = "Controller", action = "Action" } 
); 

Ist es sicher zu gehe davon aus, dass

urlHelper.Action("Action", "Controller", routeValueDictionary); 

entspricht exakt

urlHelper.RouteUrl("RouteName", routeValueDictionary); 

Antwort

1

Einmal gibt es keine Routen über dem angezeigten Mapping abgebildet sind, die die Route von

urlHelper.Action("Action", "Controller", routeValueDictionary); 

erzeugt mithalten können dann würden Sie in Ihrer Annahme sicher in Verwenden des Routennamens

wenn Sie zum Beispiel zwei Routen haben wie folgt definiert ...

routes.MapRoute(
    "AnotherRouteName", 
    "{controller}/blah/{action}", 
    new { controller = "Controller", action = "Action" } 
); 

routes.MapRoute(
    "RouteName", 
    "Url", 
    new { controller = "Controller", action = "Action" } 
); 

... dann die erste Route durch ..

urlHelper.Action("Action", "Controller", routeValueDictionary); 

UPDATE abgestimmt würde:

Wenn Sie sich die Quelle für UrlHelper ansehen

Sie werden feststellen, dass intern t Sie rufen dieselben Überladungen der gleichen Methoden mit relevanten Argumenten auf.

public virtual string Action(string actionName, string controllerName, object routeValues) 
{ 
    return GenerateUrl(null /* routeName */, actionName, controllerName, TypeHelper.ObjectToDictionary(routeValues)); 
} 

public virtual string Action(string actionName, string controllerName, RouteValueDictionary routeValues) 
{ 
    return GenerateUrl(null /* routeName */, actionName, controllerName, routeValues); 
} 

//...other code removed for brevity 

public virtual string RouteUrl(string routeName, object routeValues, string protocol) 
{ 
    return GenerateUrl(routeName, null /* actionName */, null /* controllerName */, protocol, null /* hostName */, null /* fragment */, TypeHelper.ObjectToDictionary(routeValues), RouteCollection, RequestContext, false /* includeImplicitMvcValues */); 
} 

Viel zu viel Code hier zu posten. Werfen Sie einen Blick auf die Klassenquelle, um ein besseres Verständnis davon zu bekommen, was unter der Haube passiert.

Kann nicht mehr Details als das bereitstellen. Ich bin den ganzen Weg zurück zum Quellcode gegangen.

+0

Wahr, vorausgesetzt, dass meine Routen eindeutige "Controller" - und "Action" -Kombos haben, wären "Action" und "RouteUrl" genau gleichwertig? –

+0

vorausgesetzt, sie haben die gleichen Routenwerte – Nkosi

0

Nein, nicht genau.

urlHelper.RouteUrl fügt der Route nur einen zusätzlichen Filter hinzu. Sie müssen weiterhin übereinstimmende Parameter angeben (einschließlich controller und action) oder null anstelle der erwarteten URL zurückgeben.

urlHelper.RouteUrl("RouteName", 
    new { controller = "Controller", action = "Action"[, other route values... ]); 

Der primäre Unterschied ist, dass dieser Filter nur das Routing Framework Prüfung eine Route statt alle Routen, um machen.Dies macht es unmöglich, die falsche Route beim Generieren von URLs zu finden, aber es ist immer noch möglich, dass eingehende Anfragen der falschen Route entsprechen, indem sie in der Routentabelle in der falschen Reihenfolge platziert werden. Das bedeutet, dass Sie möglicherweise URLs aus der Routentabelle generieren können tatsächlich in der Anwendung zugegriffen werden.

Sofern Sie nicht über Tausende von Routen in Ihrer Routentabelle verfügen, ist es unwahrscheinlich, dass Sie bemerkenswerte Leistungsunterschiede feststellen.

Es ist fraglich, ob es einen wirklichen Nutzen dafür gibt. Tatsächlich rufen sowohl Action als auch RouteUrl die exakt gleiche Methode in UrlHelper auf, um die URL zu generieren. Unabhängig davon, ob Sie Action oder RouteUrl zum Generieren von URLs verwenden, sollten Sie immer noch make unit tests anzeigen, um sicherzustellen, dass eingehende Routen mit der gewünschten Route übereinstimmen, und die richtigen Routenwerte zurückgeben.

RouteUrl hat einen Vorteil haben, dass Action haben nicht - Sie null als den Namen der Route passieren kann (oder eine Überlastung aufrufen, ohne Routennamen), die Sie es passieren eine fertige Satz von Routenwerte ermöglicht, ohne um separate Parameter für controller und action explizit festzulegen. Dies macht RouteUrl genau wie Action, aber macht es einfacher, mit Code zu integrieren, der die Routenwerte dynamisch manipuliert.

+0

'RouteUrl' hat eine [Überladung] (https://msdn.microsoft.com/en-us/library/system.web.mvc.urlhelper.routeurl%28v=vs.118 % 29.aspx # M: System.Web.Mvc.UrlHelper.RouteUrl% 28System.String, System.Web.RoutingVoueDictionary% 29) das erlaubt Ihnen den 'Controller' und' action' auszuschließen, aber ja, es scheint so Beide erzeugen die gleiche URL und ich muss Komponententests erstellen, um dies zu überprüfen. Ich behalte den 'Null'-Routennamen-Tipp griffbereit, danke. –