ASP.NET MVC Url.RouteUrl用于区域中的默认路由使用"详细信息"作为Action参数?

时间:2015-08-19 01:06:23

标签: asp.net-mvc asp.net-mvc-4 asp.net-mvc-routing

我有这样的路线:

context.MapRoute(
    "Agents - Default",
    "agent/{username}/{action}",
    new { controller = "Agent", action = "Profile" }
);

如果我在我的代码中这样做:

var url = helper.RouteUrl("Agents - Default", new { username })

它会生成如下网址:

  

" /剂/ joebloggs /细节"

我希望它能生成这样的URL:

  

" /剂/ joebloggs"

(当我手动点击时解析/匹配路线很好)

如果我改为:

var url = helper.RouteUrl("Agents - Default", new { username }, action = "Profile" })

它工作正常,但我认为路线默认的重点是我不需要来做这件事。

有什么想法吗?在哪里拉这个"细节"部分来自?

1 个答案:

答案 0 :(得分:2)

RouteUrl必须有足够的信息来匹配路线。路线名称只是比赛的另一个缩小规范。

但您遇到的主要问题是您没有将路由值声明为名称 - 值对,因此MVC无法将其转换为RouteValueDictionary

var url = helper.RouteUrl("Agents - Default", new { username = "MyUser" })

<强>更新

  

我在其操作名称为“详细信息”的页面上

这是你的主要问题。 MVC的默认行为是始终使用在生成传出URL时未从当前上下文设置的任何键。例如,如果您当前的操作是“详细信息”,并且在生成网址时未设置操作,则 会自动 注入路由值{{1 }}。有些人认为MVC的这个“特性”是一个bug。请参阅work item 1346

除了Microsoft在上述链接中提供的解决方案之外,另一种解决方法是创建一个虚假的请求上下文来消除这些额外的值,这在您的情况下可能更清晰。

action = "Details"