使用URL.Action帮助程序生成URL以及javascript变量的正确编码

时间:2015-01-12 12:35:34

标签: javascript jquery ajax asp.net-mvc

我正在尝试使用Url.Action帮助程序生成的URL使用AJAX在ASP.MVC中调用一个操作方法。我有一些参数是使用jQuery从DOM中提取的javascript变量。

我尝试了两种方法,都失败了。

我仅使用两个变量简化了示例。在现实世界中有四个(十进制?,字符串,字符串,字符串)。

首先

var link = '@Url.Action(MVC.ControllerName.ActionNames.Edit, MVC.ControllerName.Name)';
link = link + '?first=' + first + '&second=' + second;

在这种情况下,所有参数都传递给action方法,但是当变量包含一些非标准字符(例如“é”)时,它会格式错误,并且我在恢复它的正确编码方面遇到问题(例如“简化“而非”Simplifiés“)

第二

var link = '@Url.Action(MVC.ControllerName.ActionNames.Edit, MVC.ControllerName.Name, new { first = "-1", second = "-2"})'

link = link.replace("-1", first);
link = link.replace("-2", second);

在这种情况下,只有第一个变量(可以为十进制的可变空间)被传递给action方法。其余的是空字符串。

我注意到在第二种情况下链接看起来像这样:

  

/ ControlerName / Edit?first = 890& amp; second = Something

(890和;之间的空格只是因为堆栈溢出的html渲染而插入)

虽然在第一种情况下它看起来如下:

  

/ ControlerName /编辑第一= 890&安培;第二=东西

动作方法如下:

[HttpGet]
public virtual ActionResult Edit(decimal? first, string second)
{
   //code
}

Ajax调用如下所示:

$.ajax({
    url: link,
    type: 'get',
    cache: false,
    async: true,
    success: function (result) {
        $('#someId').html(result);
    }
});

从DOM中选择变量如下:

var first = $(this).closest('tr').find('.first').html();

1 个答案:

答案 0 :(得分:1)

@Url.Action会对您的基本网址进行必要的编码,但您必须自己处理2个javascript变量firstsecond的网址编码。

一种直截了当的方式是使用encodeURIComponent()

var link = '@Url.Action(MVC.ControllerName.ActionNames.Edit, MVC.ControllerName.Name)';
link = link 
       + '?first=' + encodeURIComponent(first) 
       + '&second=' + encodeURIComponent(second);

或者@Nilesh在评论中提到,您可以一次性使用encodeURI()

var link = '@Url.Action(MVC.ControllerName.ActionNames.Edit, MVC.ControllerName.Name)';
link = link + '?first=' + first + '&second=' + second;
linkToUse = encodeURI(link);