使用jQuery将“&”传递给ajax?

3
我有一个Ajax调用。
 function addNewRemarksToDataBase(argRemark) {
            if (argRemark != '') {
                // if not blank
                $.ajax({
                    url: '../AutoComplete.asmx/AddNewRemarks',
                    type: 'POST',
                    timeout: 2000,
                    datatype: 'xml',
                    cache: false,
                    data: 'argRemarks=' + argRemark,
                    success: function (response) {
                        // update the field that is source of remarks
                        updateRemarksSource();
                    },
                    error: function (response) {
                    }
                });
            }
        };

该方法定义为:
[WebMethod]
public void AddNewRemarks(string argRemarks)
{
    BAL.BalFactory.Instance.BAL_Comments.SaveRemarks(argRemarks, Globals.BranchID);
}

问题是,如果用户输入像long & elegant或者smart & beautiful这样包含&的内容,我只能获取到&之前的第一部分,即long(在第一个例子中),smart(在第二个例子中)(注意空格!)
我在jquery ajax文档中读到,应该将processData设置为false,因为它是用于查询字符串或其他用途的。我添加了
processData: false

但我仍然在获取&之前的术语。 我不想使用encodeURIComponent,因为它会将&转换为amp;(或类似的内容)。 我需要的是完整值long & elegantsmart & beautiful,这将保存到数据库中。 我该怎么做?

编辑执行{ argRemarks:argRemark }没有帮助! 该函数甚至没有被调用。 在firebug中运行并在错误函数中设置断点,我得到了这个:

[Exception... "Component does not have requested interface"  nsresult: "0x80004002 (NS_NOINTERFACE)"  location: "JS frame :: http://localhost:49903/js/jquery-1.8.1.min.js :: .send :: line 2"  data: no]"

更新2: 进行中

data: 'argRemarks=' + encodeURIComponent(argRemark)

这个方法解决了我的问题。但是有没有人能帮我理解这是如何工作的?我以为它会把&转换为&,但它没有这样做?现在我收到的方法参数正是我想要的,长和优雅聪明和美丽,不是encodeURIComponent()将特殊字符转换吗?


更新2:&转换为&是HTML实体编码,与此完全无关;URL编码是将&转换为%26。但在两种情况下,接收方在处理数据之前都会解码,编码只是为了让数据通过“不友好”的渠道而不受损害 - Jon
2个回答

7

您确实需要对argRemark进行编码。最简单的方法是让jQuery为您完成:

data: { argRemarks: argRemark }

这与 data: 'argRemarks=' + argRemark 不同,因为通过传递一个对象,jQuery 假定需要对该对象上的属性值进行 URL 编码 -- 而如果传递一个字符串,你需要先正确地对其进行编码。

1
如果您不想让jQuery为您完成此操作,只需使用encodeURIComponent - T.J. Crowder
@Jon: 这个不起作用!这样做,方法甚至没有被调用(断点没有被触发)。你能告诉我我做错了什么吗? - Razort4x
@Razort4x:既然这与调用方法毫无关系,那么可能是语法错误吧?在行末缺少逗号,你需要它,但我上面没有使用? - Jon
@Jon: 不对。我重新检查了语法,可能是因为现在我传递的是一个对象,就像在firebug中看到的Object { argRemarks="long & long,other & first"}那样,这意味着我需要改变我的方法接受参数的方式吗? - Razort4x
@Razort4x:不是的。 文档 已经很清楚了,这是许多开发者每天都在使用的非常常见的功能。它必须与您特定的设置或运行的其他代码有关。 - Jon

3

首先需要对字符串进行URL编码:

data: 'argRemarks=' + encodeURIComponent(argRemark)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接