将原始HTML标记分配给JavaScript变量
本文关键字:JavaScript 变量 分配 原始 HTML | 更新日期: 2023-09-27 17:54:55
我在一个现有的ASP工作。. Net应用程序,遇到了一个有趣的JavaScript片段,我一直在想。
一些变量被声明为字面量,它们不是字符串。例如,这样做:
<script type="text/javascript">
var jsonData = <asp:Literal ID="MyJsonObject" runat="server" />;
......
</script>
在服务器端代码(c#)中,这些标签实际上是由类似于以下的JsonTextWriter
更改的:
var stringBuilder = new StringBuilder();
var stringWriter = new StringWriter(stringBuilder);
using (var jsonWriter = new JsonTextWriter(stringWriter))
{
jsonWriter.Formatting = Formatting.Indented;
jsonWriter.WriteStartObject();
jsonWriter.WritePropertyName("someProperty");
jsonWriter.WriteValue("someValue");
jsonWriter.WriteEndObject();
}
MyJsonObject.Value = stringBuilder.ToString();
这反过来又导致jsonData变量能够在客户端代码中用作Json对象。
我注意到,如果我在标签周围加上单引号并将其改为:
<script type="text/javascript">
var jsonData = '<asp:Literal ID="MyJsonObject" runat="server" />';
......
</script>
这不起作用,因为它不再作为Json对象出现,而是作为一个实际的字符串。然而,正如我所料,当它只是一个普通的标签时,我从Visual Studio收到几个语法错误。
我的问题是:
这是普遍可以接受的还是我应该避免保留这样的东西?是的,它工作,但是它看起来不对。
我发现了一些似乎与此相关的不同问题,但似乎没有一个问题能对我的特殊情况提供任何见解。
简而言之:是的,这看起来可以接受。这似乎是<asp:Literal>
标签的预期用例之一。由于您正在编写Javascript对象文字,因此您甚至不需要单引号,因为这将改变代码的工作方式。
<asp:Literal>
不是一个HTML标签,因此它不会像它那样呈现给用户。采用ASP对<asp:Literal>
标签进行预处理。. NET在页面发送给用户之前(因为您指定了runat="server"
);因此,无论周围的内容如何,它都将被处理,并完全替换为已解析的字符串值。因此,您呈现的页面将从以下内容(在服务器端)进行转换:
var jsonData = <asp:Literal ID="MyJsonObject" runat="server" />;
:
var jsonData = {
"someProperty" : "someValue"
};
这是一种将服务器端构造的丰富数据传输到客户端Javascript的好方法,而无需将原始Javascript写入页面。
如果你想要一个json格式的字符串,那么做你正在做的事情,然后调用JSON.stringify(jsonData)
将是你最好的选择。