13

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

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

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

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

它完美地工作!

我的动作是这样的:

public JsonResult Action(string a, string b) 
{
    ...
}

我已经调试了我的应用程序,并且该操作被调用,甚至a"a",但是bnull

这是期望的行为Url.Action吗?我不这么认为。请帮助我,我做错了什么?我应该在Url.Action调用中添加另一个参数吗?提前致谢。

4

5 回答 5

9

这里的问题是,当您使用 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”中的结果

于 2015-10-28T20:11:07.177 回答
3

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

你找到了一种绕过它的方法,我见过其他人。因为这个问题不是问最好的方法,但不管是不是你,我可以向你保证它不是你。你没有做错任何事情。这是 Javascript 的自然行为。

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

从 e.camper 借来的例子

$.post(url, { a: "a", b: "b"}).success(...)
于 2013-03-15T04:21:32.983 回答
3

上面答案中所说的每一件事都很棒,我想在你发送 ajax 请求的方式中添加一些东西,当你想发送额外的数据时,发送它就像

var url = '@Url.Action("Action", "Controler")';
$.post(url,{a:'a',b:'b'}).success(function(data) { 
    ... 
});
于 2013-03-15T04:40:13.710 回答
2

就像我在评论中提到的那样,这是一个 JavaScript 编码问题。避免进行任何 UrlDecoding 或字符替换的最佳方法是定义与您尝试传递的参数匹配的路由

routes.MapRoute(
            "MyCustomRoute",
            "{Controller}/{Action}/{a}/{b}",
            new {controller = "Controller", action = "Action"}

将其放在默认路由上方的 global.asax 文件中。现在,当你打电话

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

输出将是/Controller/Action/a/b

于 2013-03-15T04:25:20.040 回答
0

我知道这是一个老问题,但我有一个类似的问题,所以我结束了这样做:

$.ajax({
        type: "Post",
        url: "@Url.Action("Action", "Controller")",
        data:{ param1 : "@Model.param1", param2 : "@Model.param2", param3:"@Model.param3",......,param20 : "something" },
        success: function (response) {
            $("#yourDiv").html(response);
       }
    });

我希望这对其他人有用。

于 2014-03-08T01:36:14.323 回答