我目前正在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"
,但b
为null
。
这是Url.Action
的理想行为吗?我不这么认为。请帮帮我,我做错了什么?我应该在Url.Action
电话中添加其他参数吗?提前谢谢。
答案 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);
}
});
我希望这对其他人有用。