2013-06-12 64 views
0

我想抓住一個字符串,我正在閱讀從XML文件到JS函數。出於某種原因,Chrome中的調試器表示Glist中的值不是字符串。JS不識別隱藏字段中的字符串?

代碼:

<!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字符串爲:

"Gage number|C-01001|Gage type|Caliper|Gage size|1 |Units of measure|Inches|Gage description|Digi inside w absolute encoder|Storage location|Tool Crib|Current location|Tool Crib|Status|Available|Owner|Company|Group|Calib Group|EmailTo|Bobby Mohr|Last calib date|3/28/2013|Calib due date|9/28/2013|Last RR date|9/5/2012|RR due date|9/5/2013|Last maintenance date|2/27/2013|Maintenance due date|2/27/2015|Manufacturer|Fowler|Model number|FIC-23451|Serial number|18732|Comment|CALIBRATION GROUP EXPLANATION
We defined the Calibration Group as a set of gages that will be calibrated all at the same time. We set this value using the Group field above. This allows us to easily filter for these gages and gather them for calibration. SCHEDMAINTDUE EXPLANATION We have also used the user defined fields to create a new field called SchedMaintDue. This field allows us to define a Scheduled Maintenance Due Date for easy access to filtering and reference of maintenance cycles on our gages."

雖然我已經在服務器代碼一切字符串是好的。當我傳給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; 
} 
+0

字符串是否包含那些雙引號? (開始和結束) –

+0

@millimoose當服務器端評估表達式時,「值」是正確的。 –

+0

您尚未發佈發生問題的客戶端代碼。或者輸入字段在DOM檢查器中是否具有預期值。另外,使用內聯腳本也有點令人困惑。 – millimoose

回答

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。在這種情況下,您的輸入是string,所以JavaScriptSerializer呈現整個JavaScript String文字,而不僅僅是內部。
  • 我刪除了String()這是多餘的,因爲一個字符串文字已經是一個字符串;-)。
+0

呃,這只是讓惡臭的代碼味道變得更糟。 –

+1

@BrianM - 你已經接受了這個答案,但我希望你不會走這條路。避免這種框架的範式,並且寧願將客戶端代碼與服務器標籤混合在一起,也會導致一個可怕的,有問題的,難以維護的解決方案。 –

+0

通過一個''將數據傳遞給客戶端是否有意義(它可以更自然地工作,並且在<%:'的幫助下更加簡潔),或者作爲JavaScript文字是一個不同的問題。我只試圖展示如何正確編碼JavaScript文字。不幸的是,我不知道APSX和框架範例。我完全困惑,爲什麼甚至有''首先。 – binki

3

它看起來像你的字符串中有一個換行符(右後「校準GROUP說明」)。這將在您的標籤中進行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" %> 
+0

不幸的是,傳遞一個空字符串。 – BrianM

+0

看我的編輯。我建議回到基礎知識,並學習如何使用代碼隱藏創建aspx頁面,因爲這裏缺少一些關鍵概念。 –

+0

所以我想當我嘗試將'data'保存到隱藏字段時會出現問題? – BrianM