由于使用了UrlHelper.Action,所以我希望在代码中用UrlHelper.RouteUrl替换所有业绩效益实例。根据文档,这两种方法都将生成一个完全限定的URL,我想确认它们将返回完全相同的URL。
示例:
假设RouteConfig中的路由具有唯一的controller,则action组合:
给出了RouteConfig中的以下路由
routes.MapRoute(
"RouteName",
"Url",
new { controller = "Controller", action = "Action" }
);我们是否可以假设
urlHelper.Action("Action", "Controller", routeValueDictionary);完全等价于
urlHelper.RouteUrl("RouteName", routeValueDictionary);发布于 2016-06-09 16:53:57
一旦没有在显示的映射之上映射的路由,就可以匹配从
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" }
);...then第一条路线将由..。
urlHelper.Action("Action", "Controller", routeValueDictionary);更新:
如果您查看UrlHelper的源代码
您会注意到,在内部,它们使用相关的参数调用相同方法的相同重载。
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 */);
}太多的代码不能在这里发布。看一看类源,以便更好地理解在幕后发生的事情。
不能再提供更多的细节了。我已经回到源代码了。
发布于 2016-06-09 16:54:10
不,不完全是。
urlHelper.RouteUrl只向路由添加额外的筛选器。您仍然必须提供匹配的参数(包括controller和action),否则它将返回null而不是您所期望的URL。
urlHelper.RouteUrl("RouteName",
new { controller = "Controller", action = "Action"[, other route values... ]);主要的区别是,这个过滤器只会使路由框架检查一个路由,而不是按顺序检查所有路由。这使得在生成URL时不可能匹配错误的路由,但传入的请求仍有可能通过将它们按错误的顺序放置在路由表中来匹配错误的路由--这意味着您可以从路由表生成实际无法在应用程序中访问的URL。
除非您在路由表中有数千条路由,否则您不太可能看到任何明显的性能差异。
这是否有任何真正的好处是值得怀疑的。实际上,Action和RouteUrl最终都在UrlHelper中调用完全相同的方法来生成URL。无论您使用Action还是RouteUrl来生成URL,仍然应该使用进行单元测试来确保传入的路由与您想要的路由相匹配,并返回正确的路由值集。
RouteUrl确实有一个Action没有的好处--您可以将null作为路由名传递(或者调用一个没有路由名称的重载),这允许您传递一组现成的路由值,而不必显式地为controller和action设置单独的参数。这使得RouteUrl的行为与Action完全一样,但更容易与动态操作路由值的代码集成。
urlHelper.RouteUrl(routeValueDictionary);https://stackoverflow.com/questions/37730983
复制相似问题