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

时间:2013-03-15 03:52:10

标签: asp.net-mvc asp.net-mvc-3 url razor query-string

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

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

问题是此后url的值为/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电话中添加其他参数吗?提前谢谢。

5 个答案:

答案 0 :(得分:5)

这里的问题是当你使用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'

答案 1 :(得分:3)

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

你找到了解决问题的方法,我见过其他人。由于这个问题不是问最好的方法,但是不管你是不是,我可以向你保证它不是你。你什么也没做错。这是Javascript的自然行为。

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

从e.camper借来的例子

$.post(url, { a: "a", b: "b"}).success(...)

答案 2 :(得分:3)

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

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

答案 3 :(得分: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

答案 4 :(得分: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);
       }
    });

我希望这对其他人有用。