0

我正在尝试将我正在从 XML 文件中读取的字符串抓取到 JS 函数中。由于某种原因,Chrome 中的调试器说 Glist 中的值不是字符串。

编码:

<!DOCTYPE html>

<html>

<head id="Head1" runat="server">

    <%@ Page Language="C#" %>

    <title>GAGEmobile</title>
    <link rel="stylesheet" href="/Content/MenuStyle.css" />
    <script type="text/javascript" src="Scripts/jQuery.js"></script>
    <script type="text/javascript" src="Scripts/Scripts.js"></script>
</head>
<body id="generalBody" runat="server" dir="rtl">

   <form runat="server" id="hidden">
        <input type="hidden" runat="server" value='' id="Glist" />
    </form>

    <%
       var reader = new GAGEmobile.Models.ReadXML();
       var data = reader.getDataFromXML("https://gagemobile-
       demo.servicebus.windows.net/gagemobile/gage/15/sample/david/blah");
       this.Glist.Value = data;
    %>

    <script type="text/javascript">
        $(document).ready(function () {
            displayGageInfo(String("<%: Glist.Value %>"));
         });

    </script>

</body>
</html>

GList 中的字符串是:

"量具编号|C-01001|量具类型|卡尺|量具尺寸|1 |测量单位|英寸|量具描述|Digi inside w绝对编码器|存储位置|工具箱|当前位置|工具箱|状态|可用|所有者|公司|集团|Calib 集团|EmailTo|Bobby Mohr|最后校准日期|2013 年 3 月 28 日|校准截止日期|2013 年 9 月 28 日|最后 RR 日期|2012 年 9 月 5 日|RR 截止日期|9/5 /2013|最后维护日期|2/27/2013|维护到期日期|2/27/2015|制造商|Fowler|型号|FIC-23451|序列号|18732|评论|校准组说明
我们将校准组定义为一组同时校准的量具。我们使用上面的 Group 字段设置此值。这使我们能够轻松过滤这些量具并收集它们进行校准。SCHEDMAINTDUE 解释我们还使用用户定义的字段来创建一个名为 SchedMaintDue 的新字段。该字段允许我们定义计划维护到期日期,以便轻松访问过滤和参考我们量具上的维护周期。”

虽然我在服务器代码中有字符串,但一切都很好。当我传递给 JS 时出现问题,我不知道为什么。

我试过在 JS 中使用 escape() 和 toString() 函数。

编辑:错误发生在 'displayGageInfo(String("<%: Glist.Value %>"));' 作为无法识别的令牌

读取 XML 的 ASP.NET:

public string getDataFromXML(string url)
{
   var xml = new XmlDocument();
   xml.Load(url);
   return xml.InnerText;
}
4

2 回答 2

3

看起来您的字符串中有一个换行符(就在“校准组解释”之后)。这将在您的标签中进行 HTML 编码;但是,在 的服务器端评估中GList.Value,它将被转换为换行符,不会被HtmlEncode.

因此,在生成的 JS 中,您的字符串文字中有一个换行符。这是无效的。

取消服务器标签并将您的 Javascript 更改为:

<script type="text/javascript">
    $(document).ready(function () {
        displayGageInfo($('#Glist').val());
    });
</script>

这将避免在代码块中动态生成字符串文字的讨厌业务,并让您的客户端代码关注进行客户端处理。

此外,您的内联代码执行得太晚,无法实际填充隐藏字段中的值。我希望如果您检查渲染的标记,隐藏字段在加载后仍然没有任何值。这是因为服务器标签是在事件之后执行的PreRender,这是您对控件进行更改的最后机会。您需要在页面生命周期的早期运行此代码(尝试Page_Load):

<script runat="server">
    protected void Page_Load(object sender, EventArgs e)
    {
        var reader = new GAGEmobile.Models.ReadXML();
        var data = reader.getDataFromXML("https://gagemobile-
        demo.servicebus.windows.net/gagemobile/gage/15/sample/david/blah");
        this.Glist.Value = data;
    }
</script>

您还需要打开AutoEventWireup页面,以确保在页面的 OnLoad 事件上触发此方法:

<%@ Page Language="C#" AutoEventWireup="true" %>
于 2013-06-12T19:33:28.097 回答
1

JavaScript 不允许字符串文字在其中包含文字换行符。您必须将换行符转义为\n. 这就是导致您出现语法错误的原因。

您永远不应该尝试手动将动态计算的值表示为 JavaScript 文字。相反,请使用正确的工具来完成这项工作,例如JavaScriptSerializer。您修改为使用它的 ASPX 如下所示:

<script type="text/javascript">
    $(document).ready(function () {
        displayGageInfo(<%=new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(Glist.Value)%>);
     });

</script>

请注意我从您的代码中更改的这些内容:

  • 我从 切换<%:到 是<%=因为 JSON 是 HTML 安全的,只要它不用作属性值的一部分。此外,默认情况下,ASPX 将文件发送到客户端Content-Type: text/html而不是Content-Type: application/xhtml+xml,因此如果"JSON 中的 已被实体编码为&quot;,浏览器将尝试&quot;逐字读取而不是将其解释为". (当浏览器将文件解释为 XML 时,&quot;这里完全可以接受)。
  • 我已删除您手动插入的双引号。JavaScriptSerializer 接受任何给定的对象并将其表示为 JSON。在这种情况下,您的输入是 a string,因此 JavaScriptSerializer 呈现整个 JavaScript 字符串文字,而不仅仅是内部。
  • 我删除String()了这是多余的,因为字符串文字已经是字符串;-)。
于 2013-06-12T19:58:04.083 回答