2015-11-06 70 views
1

我試圖從數據庫中呈現項目列表作爲JSON塊,以便我可以在客戶端通過JavaScript使用它。我認爲最好的方法是使用Repeater或ListView來呈現我的項目,但是我得到一個「服務器標記不正確」的錯誤。JavaScript塊內的服務器控件

這是我的代碼

<asp:ListView runat="server" ID="rptAddresses" ItemPlaceholderID="plcItems"> 
     <LayoutTemplate> 
      <script type="text/javascript"> 
       var addressConfig = [ 
        <asp:Placeholder ID="plcItems" runat="server"/> 
       ]; 
      </script> 
     </LayoutTemplate> 
     <ItemTemplate> 
      { 
       'id': '<asp:Literal runat="server" Text="<%# Eval("AddressID") %>" />', 
       'name':... 

我在做什麼錯?

回答

2

我不知道你在做什麼錯,但它可能是你的字面意思。你可以做這個:

'id': '<%# Eval("AddressID") %>' 

也就是說有其他選擇,以發送一個數組來你的腳本:

ClientScriptManager.RegisterArrayDeclaration內置的框架。下面是從鏈接頁面取一個例子:

' Define the array name and values. 
Dim arrName As String = "MyArray" 
Dim arrValue As String = """1"", ""2"", ""text""" 
' Get a ClientScriptManager reference from the Page class. 
Dim cs As ClientScriptManager = Page.ClientScript 

' Register the array with the Page class. 
cs.RegisterArrayDeclaration(arrName, arrValue) 

這會使下面的數組只是你的形式結束前:

var MyArray = new Array("1", "2", "text"); 

就個人而言,我更喜歡使用JavaScriptSerializer,因爲你可以自由序列基本上任何對象:

Protected Function GetArray() As String 
    Dim exampleList As New List(Of Pair) From {New Pair(7, 4), New Pair("Foo", "Bar")} 
    Dim serializer As New Script.Serialization.JavaScriptSerializer() 
    Return serializer.Serialize(exampleDictionay) 
End Function 

然後,您可以將其添加到您的.aspx文件的任何地方你喜歡:

var myArray = <%=GetArray()%>; 

實際上呈現爲一個數組文本:

var myArray = [{"First":7,"Second":4},{"First":"Foo","Second":"Bar"}]; 

當然,你也可以做到這一點完全在你的ASPX標記:

<% Dim serializer As New Script.Serialization.JavaScriptSerializer() %> 
var array = <%= serializer.Serialize({"look", "at", "this"})%>; 
+0

感謝丹尼爾,這看起來像是一個解決方案,但我覺得它增加了很多視覺樣板。下面我找到了一個(相當)優雅的解決方案。 – Echilon

1

多的調整後,與單一和所有組合雙引號,我最終通過將<script>標籤置於文字中來解決此問題。即:

<LayoutTemplate> 
     <asp:Literal runat="server" Text='<script type="text/javascript">' /> 
      var macroConfig = [ 
       <asp:Placeholder ID="plcItems" runat="server"/> 
      ]; 
      $(document).ready(function() { 
       ... 
      }); 
     <asp:Literal runat="server" Text='</script>' /> 
    </LayoutTemplate> 

看來解析器被用在script標籤結束,服務器控件標記開始混淆。