将原始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收到几个语法错误。

我的问题是:

这是普遍可以接受的还是我应该避免保留这样的东西?是的,它工作,但是它看起来不对。

我发现了一些似乎与此相关的不同问题,但似乎没有一个问题能对我的特殊情况提供任何见解。

将原始HTML标记分配给JavaScript变量

简而言之:是的,这看起来可以接受。这似乎是<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)将是你最好的选择。