JavaScript块内部的服务器控件

Server Controls Inside a JavaScript Block

本文关键字:服务器控件 内部 JavaScript      更新时间:2023-09-26

我试图将数据库中的项目列表呈现为JSON块,这样我就可以通过JavaScript在客户端使用它。我认为最好的方法是使用Repeater或ListView来呈现我的项目,但我收到了一个"服务器标记格式不正确"的错误。

这是我的代码

<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':...

我做错了什么?

我不确定你做错了什么,但这可能是你的字面意思。你可以这样做:

'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"})%>;

在对所有单引号和双引号的组合进行了大量调整之后,我最终通过将<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标记的结束位置和服务器控制标记的开始位置。