首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UrlHelper.Action是否等同于UrlHelper.RouteUrl?

UrlHelper.Action是否等同于UrlHelper.RouteUrl?
EN

Stack Overflow用户
提问于 2016-06-09 16:00:15
回答 2查看 4.7K关注 0票数 0

由于使用了UrlHelper.Action,所以我希望在代码中用UrlHelper.RouteUrl替换所有业绩效益实例。根据文档,这两种方法都将生成一个完全限定的URL,我想确认它们将返回完全相同的URL。

示例:

假设RouteConfig中的路由具有唯一的controller,则action组合:

给出了RouteConfig中的以下路由

代码语言:javascript
复制
routes.MapRoute(
    "RouteName",
    "Url",
    new { controller = "Controller", action = "Action" }
);

我们是否可以假设

代码语言:javascript
复制
urlHelper.Action("Action", "Controller", routeValueDictionary);

完全等价于

代码语言:javascript
复制
urlHelper.RouteUrl("RouteName", routeValueDictionary);
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-09 16:53:57

一旦没有在显示的映射之上映射的路由,就可以匹配从

代码语言:javascript
复制
urlHelper.Action("Action", "Controller", routeValueDictionary);

那么,在使用路线名称时,您的假设是安全的。

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

代码语言:javascript
复制
routes.MapRoute(
    "AnotherRouteName",
    "{controller}/blah/{action}",
    new { controller = "Controller", action = "Action" }
);

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

...then第一条路线将由..。

代码语言:javascript
复制
urlHelper.Action("Action", "Controller", routeValueDictionary);

更新:

如果您查看UrlHelper的源代码

您会注意到,在内部,它们使用相关的参数调用相同方法的相同重载。

代码语言:javascript
复制
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 */);
}

太多的代码不能在这里发布。看一看类源,以便更好地理解在幕后发生的事情。

不能再提供更多的细节了。我已经回到源代码了。

票数 1
EN

Stack Overflow用户

发布于 2016-06-09 16:54:10

不,不完全是。

urlHelper.RouteUrl只向路由添加额外的筛选器。您仍然必须提供匹配的参数(包括controlleraction),否则它将返回null而不是您所期望的URL。

代码语言:javascript
复制
urlHelper.RouteUrl("RouteName", 
    new { controller = "Controller", action = "Action"[, other route values... ]);

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

除非您在路由表中有数千条路由,否则您不太可能看到任何明显的性能差异。

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

RouteUrl确实有一个Action没有的好处--您可以将null作为路由名传递(或者调用一个没有路由名称的重载),这允许您传递一组现成的路由值,而不必显式地为controlleraction设置单独的参数。这使得RouteUrl的行为与Action完全一样,但更容易与动态操作路由值的代码集成。

代码语言:javascript
复制
urlHelper.RouteUrl(routeValueDictionary);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37730983

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档