6

在我的例子中,我试图将 JavaScript 对象从后面的 C#.NET 代码动态拆分为 HTML 标记。获取数据后,我准备字符串并在字符串中创建对象,然后将其吐出到 HTML 标记中。

var fileUploadDic = { 'firstname': 'Jo''hn', 'lastname' : 'Macy' , 'country' : 'USA };

稍后在其他一些操作中,例如按钮单击,我试图拉出名字,它给了我一个 JavaScript 错误,因为名字属性中的值没有被转义以处理单引号。虽然我可以在代码后端准备对象字符串时这样做,但我更喜欢在客户端做一些事情。

var dv = $('#dv1')
dv.append(fileUploadDic.firstname);  //gives me error.
dv.append(fileUploadDic.lastname);
dv.append(fileUploadDic.country);

JavaScript中有什么方法可以在从对象中获取字符时进行字符转义。

http://jsfiddle.net/uagFu/8/

4

4 回答 4

7

尽管您正在寻找客户端解决方案,但最稳定和最可靠的方法是使用服务器端JavaScriptSerializer来序列化您的 C#对象转换为 JSON 字符串。

这些库旨在解决这些问题,并消除使用您的 API 的人(在这种情况下,只有您)需要以特殊方式处理数据的需要,仅仅是因为它包含未终止的字符串文字。

Employee oEmployee1 = 
   new Employee{Name="Pini",ID="111", Age="30"};

System.Web.Script.Serialization.JavaScriptSerializer oSerializer = 
     new System.Web.Script.Serialization.JavaScriptSerializer();
string sJSON = oSerializer.Serialize(oEmployee1);

接下来,将 sJSON 从您的 AJAX 请求返回到客户端,并像处理任何其他 JSON 字符串一样对其进行处理。

有关更多信息和更多详细信息,请参阅使用 JavaScriptSerializer 在 C# 中将对象转换为 JSON 。

于 2012-05-18T06:36:54.690 回答
2

在您准备使用的字符串中:

"var fileUploadDic = { 'firstname': 'Jo\\'hn', 'lastname' : 'Macy' , 'country' : 'USA };"

现在客户端看起来像:

var fileUploadDic = { 'firstname': 'Jo\'hn', 'lastname' : 'Macy' , 'country' : 'USA };

如果你想替换''客户端,你可以使用[varstr].replace(/''/g,"\\'"),但我认为客户端为时已晚(错误已经在到达和解释发送的字符串时抛出)

于 2012-05-18T06:36:22.827 回答
2

您显示的第一行代码不是有效的 JavaScript:

var fileUploadDic = { 'firstname': 'Jo''hn', 'lastname' : 'Macy' , 'country' : 'USA };

因为字符串'Jo''hn'中不能有这样的单引号。它必须是'Jo\'hn'"Jo'hn"。也就是说,如果你的 JS 字符串用单引号引起来,你必须用反斜杠转义字符串中的每个单引号字符,但如果你的 JS 字符串用双引号引起来,你可以在字符串中自由使用单引号。如果您想要连续两个单引号'Jo\'\'hn'"Jo''hn".

你无法修复这个客户端,因为它是无效的 JavaScript,它不会运行。

你必须在服务器端修复它;最简单的方法可能是用反斜杠转义它,注意如果它在 C# 字符串中,您也需要转义反斜杠,以便浏览器的实际输出包含反斜杠:

"var fileUploadDic = { 'firstname': 'Jo\\'hn', 'lastname' : 'Macy' , 'country' : 'USA };"
于 2012-05-18T06:40:20.940 回答
0

你可以使用\'...

jsfiddle

那是你要的吗?实际上似乎只使用单引号就可以完全不转义,因为您在 jsfiddle 的定义中使用了 " 双引号 ...但现在我想我不明白您想要什么。

如果您确实希望出现两个单引号,那么您可以使用“Jo\'\'hn”...为我工作。

于 2012-05-18T06:31:39.567 回答