我正在尝试从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 |测量单位|英寸|量具描述|绝对值编码器|存储位置|工具架|当前位置|工具架|状态|可用|所有者|公司|集团| Calib Group | EmailTo | Bobby Mohr |上次校准日期| 3/28/2013 | Calib截止日期| 9/28/2013 |最后RR日期| 9/5/2012 | RR到期日| 2013年9月5日|上次维护| 2013年2月27日|维护到期日| 2015年2月27日|制造商|福勒|型号| FIC-23451 |序列号| 18732 |评论| CALIBRATION GROUP EXPLANATION
我们将校准组定义为一组将同时校准的量具。我们使用上面的“组”字段设置此值。这使我们可以轻松过滤这些量具并收集它们进行校准。 SCHEDMAINTDUE解释 我们还使用用户定义的字段来创建一个名为SchedMaintDue的新字段。此字段允许我们定义计划维护到期日,以便轻松访问我们的量具上的过滤和维护周期参考。“
虽然我在服务器代码中有字符串,但一切都很好。这是我传给JS的时候出了问题,我不明白为什么。
我尝试在JS中使用escape()和toString()函数。
编辑: 错误发生在'displayGageInfo(String(“&lt;%:Glist.Value%&gt;”));'作为无法识别的标记
读取XML的ASP.NET:
public string getDataFromXML(string url)
{
var xml = new XmlDocument();
xml.Load(url);
return xml.InnerText;
}
答案 0 :(得分:3)
看起来你的字符串中有一个换行符(在“CALIBRATION GROUP EXPLANATION”之后)。这将在您的代码中进行HTML编码;但是,在GList.Value
的服务器端评估中,它将转换为换行符,而换行符不会被HtmlEncode
转义。
因此,您在生成的JS中的字符串文字中有换行符。这是无效的。
取消服务器标签并将您的Javascript更改为:
<script type="text/javascript">
$(document).ready(function () {
displayGageInfo($('#Glist').val());
});
</script>
这将避免在代码块中动态生成字符串文字的繁琐业务,并让客户端代码关注客户端处理。
此外,您的内联代码执行得太晚,无法在隐藏字段中实际填充值。我希望如果你检查你的渲染标记,隐藏字段在加载后仍然没有值。这是因为服务器标签在<{strong> 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
,以确保在Page的OnLoad事件上触发此方法:
<%@ Page Language="C#" AutoEventWireup="true" %>
答案 1 :(得分: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中的"
已经实体编码为"
,则浏览器会尝试逐字阅读"
,而不是将其解释为"
。 (当浏览器将文件解释为XML时,"
在这里完全可以接受)。string
,因此JavaScriptSerializer呈现整个JavaScript字符串文字,而不仅仅是内部。String()
,这是多余的,因为字符串文字已经是字符串; - )。