具有多个路由值的Url.Action助手的问题

eca*_*ver 12 url asp.net-mvc query-string razor asp.net-mvc-3

我目前正在VS2010中开发一个ASP.NET MVC3应用程序,而且我在使用@Url.Action帮助器时遇到了一些麻烦.我有一个ajax请求,我使用这个帮助器:

var url = '@Url.Action("Action", "Controler", new { a = "a", b = "b" })';
$.post(url).success(function(data) { 
    ... 
});
Run Code Online (Sandbox Code Playgroud)

问题是url此后的值是/Controller/Action?a=a&b=b,注意&路由值之间的值.这不起作用,但如果我这样做:

var url = '@Url.Action("Action", "Controler", new { a = "a", b = "b" })'.replace('amp;', '');
Run Code Online (Sandbox Code Playgroud)

它完美地工作!

我的行动是这样的:

public JsonResult Action(string a, string b) 
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

我已经调试我的应用程序和动作被调用,甚至a就是"a",不过bnull.

这是期望的行为Url.Action吗?我不这么认为.请帮帮我,我做错了什么?我应该在Url.Action通话中添加其他参数吗?提前致谢.

ngl*_*ess 7

这里的问题是当你使用razor语法时:@...razor引擎将Url.Action(这是一个字符串)的结果编码为MvcHtmlString.这导致&符编码为&.要解决此问题,请使用Html.Raw(返回非HTML编码的标记.)

var url = '@Html.Raw(Url.Action("Action", "Controller", new { a = "a", b = "b" }))';

导致:'/ Controller/Action?a = a&b = b'

感谢@GSerg(请参阅Dave Alperovich的回答中的评论)......但是期望的结果不是javascript编码.HttpUtility.JavaScriptStringEncode("&")在"\ u0026"中使用结果


Dav*_*ich 3

不是你。Javascript将&识别为受保护字符并对其进行“编码

你找到了一种解决方法,我也见过其他方法。因为这个问题不是问最好的方式,但无论是不是你,我可以向你保证,这不是你。你没有做任何明显错误的事情。这是 Javascript 的自然行为。

如果我们讨论最佳方法,我更喜欢@Url.Action仅使用它来获取 URL,并将参数作为参数传递给我的 JQuery 方法(.Ajax 方法是我最喜欢的)。

借自 e.camper 的示例

$.post(url, { a: "a", b: "b"}).success(...)
Run Code Online (Sandbox Code Playgroud)

  • 我讨厌反驳*这不是你*位,但实际上是你@ecampver - 你正在为JS字符串生成值,这应该正确完成: `var url = '@HttpUtility.JavaScriptStringEncode(Url.Action("Action) ", "控制器", new { a = "a", b = "b" }))';`。另外,*Javascript 标识 &* 也是错误的 - 它是 Razor 引擎输出“Url.Action”的结果,它是一个字符串,而不是“MvcHtmlString”,因此它在生成 HTML 响应时进行编码。为了防止这种情况,我们使用了“Html.Raw”,但因为我们要生成一个 JS 字符串,所以我们使用“JavaScriptStringEncode”。 (2认同)