2016-06-09 149 views
0

我想在我的代码中替换UrlHelper.Action的所有实例UrlHelper.RouteUrl,因为performance benefits。根据该文档,这两种方法都会生成完全限定的URL,我想确认它们将返回相同的URL地址确切的UrlHelper.Action是否等同于UrlHelper.RouteUrl?


例子:

假设在RouteConfig该航线拥有独特controlleraction组合:

鉴于以下路线RouteConfig

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

它是安全的假设

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

完全等同于

urlHelper.RouteUrl("RouteName", routeValueDictionary); 

回答

1

一旦没有你上面的显示映射映射的路线,可以匹配来自

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

产生的途径,那么你会在你担任安全使用路由名称。

例如,如果你有这样的定义两条路线......

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

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

...那么第一条路线将由..

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

UPDATE匹配:

如果你看看来源UrlHelper

你会注意到内部t嘿调用与相关的参数相同的方法相同的重载。

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 */); 
} 

太多的代码张贴在这里。看看课堂来源,更好地了解发生了什么。

无法提供更多的细节。我一直回到源代码。

+0

是的,假设我的路线有独特的'controller'和'action'组合,'Action'和'RouteUrl'完全等价吗? –

+0

前提是它们具有相同的路由值 – Nkosi

0

不,不完全一样。

urlHelper.RouteUrl只为路由添加了附加过滤器。您仍然必须提供匹配的参数(包括controlleraction),否则它将返回null而不是您期望的URL。

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

的主要区别是,这个过滤器只会让路由架构检查一个路由,而不是所有路由的秩序。这使得在生成URL时无法匹配错误的路由,但传入的请求仍然可能通过将路由表中的错误顺序放入路由表中来匹配错误的路由 - 这意味着您可能会从路由表中生成无法生成URL的URL实际上可以在应用程序中访问。

除非您的路由表中有成千上万的路由,否则不太可能会看到任何明显的性能差异。

这是否有真正的好处是值得怀疑的。实际上,ActionRouteUrl最终都会调用UrlHelper中完全相同的方法来生成URL。无论您使用Action还是RouteUrl来生成URL,您仍应该使用make unit tests来确保传入的路由与您要的路由匹配并返回正确的路由值集。

RouteUrl确实有一个好处就是Action没有 - 你可以通过null作为路由名称(或不叫路线名称的过载),它允许你将它传递了一个现成的一套路由值,而不必为controlleraction明确设置单独的参数。这使得RouteUrl的行为与Action完全相同,但使它更易于与代码动态地操纵路由值。

urlHelper.RouteUrl(routeValueDictionary); 
+0

RouteUrl确实有[重载](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.Routing.RouteValueDictionary%29),它允许你排除'controller'和'action',但是它确实出现两者都生成相同的URL,我需要创建单元测试来验证这一点。我会保留'null'路由名称提示,谢谢。 –

相关问题