ASP.NET MVC Html.ActionLink结果URL的编码方式

6

我在MVC控制器中创建了一些操作。

public ActionResult DoSmth1(string token)
public ActionResult DoAnother2(string token)

当我需要调用ActionLink时..

=Html.ActionLink<SomeController>( x=> x.DoSmth(item.property), item.property)
=Html.ActionLink<AnotherController>( x=> x.DoAnother(item.property), item.property)

...它会生成不同的URL:

/Some/DoSmth/stringvalue
/Another/DoAnother?property=stringvalue

在哪里设置构建URL的方式?我已经没有思路了...((


好的,我有一些想法:

  • 如果属性名称与路由模式中使用的名称相同 - 如控制器、操作和id - MVC将始终使用路由生成器 (/c/a/id)。

这可以帮助解决问题(因此尽可能将参数“id”命名为可能的名称)。

但是总体问题仍然存在...


必须与路由中的标记名称相同

没错 - 我最初也有这个想法。

但是 - 现在我只有默认路由({controller}/{action}/{id}),但仍然具有带有“属性”的URL路径... 这相当奇怪。

  • 还有一个欺骗方法 - 创建一个精确匹配给定控制器及其参数名称的路由 - 看起来这将是最终答案 - 但我仍然不想这样做 ((
1个回答

4
您没有展示您的路由,但在这个例子中您几乎肯定会命中不同的路由。您操作的参数必须与路由中的标记名称相同,以便生成的URL与ActionLink的lambda形式匹配路由标记。任何不匹配路由标记的内容都将作为查询字符串参数附加,就像您第二个URL一样。看到查询字符串参数是强有力的证据表明您隐含传递的名称(在本例中为“property”)与路由标记不匹配。由于您使用相同的标记名称得到了不同的结果,因此我推断您正在命中不同的路由。顺便说一句,我建议使用RouteLink构建链接,以便您可以确定将匹配哪个路由。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接