2015-11-06 66 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标签结束,服务器控件标记开始混淆。