0

我有一个在页面预渲染事件上执行的 java 脚本函数:

protected void Page_PreRender(object sender, EventArgs e)
{
     var script = "<script>CreateProjectTree('" + serializedSearchCriteria + "');" + "</script>";
     ClientScript.RegisterStartupScript(typeof (string), "createProjectTree", script);
}

Page_Load传递给上述 java 脚本函数的变量是在事件中填充的序列化 JSON :

serializedSearchCriteria = JsonConvert.SerializeObject(ProjectSearchCriteria);

这是 serializedSearchCriteria 序列化后的值:

{"QueryString":null,"ProjectName":"\"24\"","SeasonName":"","MemberName":"","CompanyName":"","CompanyRole":0,"CompanyRoles":"","Year":""}

您可以看到序列化它成功地转义了 value 的双引号24

这里的问题是,当我在调试模式下查看 java 脚本函数时,变量 serializedSearchCriteria 的值现在是这样的:

{"QueryString":null,"ProjectName":""24"","SeasonName":"","MemberName":"","CompanyName":"","CompanyRole":0,"CompanyRoles":"","Year":""}"

注意24现在。它不再逃脱。因此,一旦该对象位于 java 脚本函数中,它就不再是有效的 JSON。

为什么会这样?

该对象应该以 SERIALIZED 形式出现……在某些时候,它会被取消序列化。有谁知道为什么?

4

3 回答 3

1

当浏览器评估script元素时,它还会解析您的 javascript,查看这些反斜杠并使用它们。你需要逃脱逃脱。

如果您真的想将 JSON 字符串传递给CreateProjectTree函数,有时最简单的方法是重新序列化它,而不是尝试将其作为序列化字符串插入脚本中:

var script = "<script>CreateProjectTree(JSON.stringify(" + serializedSearchCriteria + "));" + "</script>";
于 2013-09-06T19:58:56.943 回答
0

因为它被解析为 JavaScript 字符串文字,\所以转义字符在哪里。

如果要输出包含 JSON 文本的 JavaScript 字符串文字,则需要转义其中的任何特殊字符(即,用于分隔字符串的任何引号字符和\s)。

于 2013-09-06T19:58:05.597 回答
0

我认为它被视为字符串,请尝试:

var script = "<script>CreateProjectTree(JSON.parse('" + serializedSearchCriteria + "'));" + "</script>";

您会注意到 JSON.parse js 函数已被添加。

于 2013-09-06T19:58:26.230 回答