【问题标题】:Assign a raw HTML tag to a JavaScript variable将原始 HTML 标记分配给 JavaScript 变量
【发布时间】:2015-08-26 03:42:12
【问题描述】:

我正在开发一个现有的 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 收到几个语法错误。

所以我的问题是:

这是通常可以接受的事情还是我应该避免保留这样的事情?是的,它有效,但我觉得它不合适。

我发现了一个few different questions 似乎与这里相关,但似乎没有一个可以提供任何关于我的特殊情况的见解。

【问题讨论】:

    标签: javascript c# json


    【解决方案1】:

    简而言之:是的,这看起来可以接受。这似乎是&lt;asp:Literal&gt; 标签的预期用例之一。由于您正在编写 Javascript 对象文字,因此您甚至不需要单引号,因为这会改变代码的工作方式。

    需要注意的是&lt;asp:Literal&gt; 不是 HTML 标记,因此不会按原样呈现给用户。 &lt;asp:Literal&gt; 标签在页面发送给用户之前由 ASP.NET 进行预处理(因为您指定了 runat="server");因此,无论周围的内容如何,​​它都会被处理并完全替换为解析的字符串值。因此,您呈现的页面将被转换(在服务器端):

    var jsonData = <asp:Literal ID="MyJsonObject" runat="server" />;
    

    到这里:

    var jsonData = {
        "someProperty" : "someValue"
    };
    

    这是一种将在服务器端构建的丰富数据传输到客户端 Javascript 的好方法,而无需将原始 Javascript 写入页面。

    如果您想要一个 JSON 格式的字符串,那么做您正在做的事情并在之后调用 JSON.stringify(jsonData) 将是您最好的选择。

    【讨论】:

    • 这正是我正在寻找的那种回应。我想 Visual Studio 的语法错误让我很好奇,因为我以前从未见过类似的东西。通过使用隐藏字段,我能够在某一时刻消除错误,但这需要一些额外的努力,最终变得过于混乱。谢谢你的解释!
    • 有趣的是,我最后一次接触 ASP 是在 6 年前;我使用 JSP 和 JSP 标记库,它们非常相似,足以解决这个特定问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-17
    • 2023-03-26
    • 1970-01-01
    • 2018-01-11
    • 2014-12-05
    • 1970-01-01
    相关资源
    最近更新 更多