我有这样的路线:
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" })
它工作正常,但我认为路线默认的重点是我不需要来做这件事。
有什么想法吗?在哪里拉这个"细节"部分来自?
答案 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"