所以,我有一些我在控制器中创建的json数据,如下所示:
Notes = JsonConvert.SerializeObject(contact.Notes.OrderBy(x => x.DateLogged).Select(x => new
{
id = x.Id,
date = x.DateLogged,
content = x.Content,
logged = x.Username
}))
然后将其传递给视图,现在可以使用哪个语句来实现变量包含json数据的结果:
var data = '@Html.Raw(Model.Notes)'
或
var data = JSON.parse('@Html.Raw(Model.Notes)');
修改
content
变量包含一些“\ n”,当使用上面的第一个选项传递给视图时会产生错误,说
意外令牌
它只与\n
一起使用,所以这里出了什么问题?底部方法不太有用。
答案 0 :(得分:2)
var data = JSON.parse('@Html.Raw(Model.Notes)');
这不起作用 - 您不能将JSON文字放在JavaScript字符串中。其中的任何反斜杠都将是JavaScript解析器的转义字符,而不是JSON解析器。换行符如下:
var data = JSON.parse('{"content": "abc\ndef"}');
这意味着您要求JSON解析的字符串是:
{"content": "abc
def"}
无效,因为您无法在JSON字符串中使用文字换行符。
要使用JSON.parse
执行此操作,您必须对JS-string-literal编码JSON输出,因此最终会得到"abc\\ndef"
。另一种方法是将JSON直接包含在脚本块中作为var data = @Html.Raw(Model.Notes);
,但是这与JS和JSON(主要是字符U + 2028和U + 2029)之间的差异以及封闭的HTML有关上下文(即序列</script
的作用)。
在这里进行转义比看起来更难,所以你应该避免在<script>
块中注入任何东西。最好将页内JSON数据放在data-
属性中,并从DOM中读取它;通过这种方式,您可以使用普通的HTML转义Razor默认为您提供。
<div id="notes" data-notes="@Model.Notes">
...
var data = JSON.parse(document.getElementById('notes').getAttribute('data-notes'));
答案 1 :(得分:0)
bobince在他所说的内容显然是正确的,它非常有意义,谢谢你。
但是,我的解决方案就是:
var data = @Html.Raw(Model.Notes);
因为,Newtonsoft已经将它转换为适当的JSON格式,因此需要做的就是将其分配给要操作的变量。
我认为从HTML DOM中获取内容对此来说有点太多了。