0

我正在尝试将 JavaScript 变量传递给服务器端标记以避免回发。

我希望解决方案看起来像这样:

代码背后:

Public Property NameCollection As Dictionary(Of String, String)

我希望拥有的 JavaScript:

$('#<%= txtIDNumber.ClientID %>').change(function(){
    var idNumber = $('#<%= txtIDNumber.ClientID %>').val();
    var lblName = $('#<%= lblName.ClientID %>');

    <%If NameCollection.ContainsKey(idNumber) Then %>
        lblName.html('<%=NameCollection(idNumber)%>');
    <%Else%>
        lblName.html('<span class="error">Not a User</span>');
    <%End If %>
});

如果我对 idNumber 进行硬编码(比如“1234”或其他内容),这些服务器端标签可以正常工作,所以我知道我的对象/代码本身工作正常,但是有没有办法让它识别/传递 JavaScript 变量这里?

额外信息: 我确实有一个实用的解决方法,但它是循环遍历集合中所有项目的丑陋且低效的方法,所以我想知道如果有办法更好地做到这一点。感谢帮助。:)

编辑澄清:

这是我目前的解决方法。非常难看,因为我想不出一种仅使用 idnumber 作为索引而不是循环遍历所有项目的方法。NameCollection 已经加载了 ASP.NET 页面加载事件中的数据,所以虽然我不确定服务器端标签在后台发生了什么,但我假设数据应该以静态方式存在于该对象中在最后一次调用服务器时,但快照这些数据的一部分物理存在于客户端(它必须避免回发,对吗?)?因此,我应该能够避免在这里与服务器交谈,因为我只访问应该已经在客户端的数据?如果我错了,请纠正我(请很好地),因为我不是 JavaScript 或 Web 编程方面的专家,而且我在服务器端标签上几乎找不到像样的参考资料。

$('#<%= txtIDNumber.ClientID %>').change(function(){
    var idnumber = $('#<%= txtIDNumber.ClientID %>').val();
    var lblName = $('#<%= lblName.ClientID %>');
    var tempJSKey = '';
    var tempJSValue = '<span class="error">Not a Member</span>';

    <%If Not NameCollection Is Nothing Then%>
        <%For Each kvp As System.Collections.Generic.KeyValuePair(Of String, String) In NameCollection %>
            tempJSKey = '<%=kvp.Key %>';
            if (tempJSKey == idnumber)
            {
                tempJSValue = '<%=kvp.Value%>';
            }
        <%Next%>
    <%End If%>
    lblName.html(tempJSValue);
});
4

4 回答 4

3

不,您不能将服务器端代码与 javascript 混合使用。

解析甚至在传递给客户端之前就发生在服务器上。

如果您出于某种原因想在服务器上使用客户端 ID,请使用:

ClientIDMode="Static"

例如:

<asp:TextBox ID="txtIDNumber" runat="server" ClientIDMode="Static" /> 
于 2012-12-27T00:13:19.777 回答
2

我认为您对 ASP 的工作原理感到困惑。当您<% anything %>在服务器上进行评估时,在任何东西到达客户端/浏览器之前。一旦被评估,页面的评估版本被发送给客户端;从那时起<% anything %>就完全没有意义了。

鉴于此,希望您能理解为什么将世界上所有的 ASP 都投入到您的 JS 中根本无济于事:当涉及 JS 代码时已经“为时已晚”。

如果要将数据发送回服务器,有两种选择:

1) 传统的 HTML 表单

2) AJAX 请求

两者都有其优点/缺点,并且都要求您在服务器上创建提交点,但是详细介绍超出了此答案的范围。可以这么说,阅读处理表单提交和使用 ASP 处理 AJAX 请求,您应该会发现很多可用的材料。

于 2012-12-27T00:13:13.833 回答
0

您不能将 javascript 传递给服务器端“元素”,但为什么不将代码更改为:

$('#<%= txtIDNumber.ClientID %>').change(function(){

    var lblName = $('#<%= lblName.ClientID %>');

    <%If NameCollection.ContainsKey(txtIDNumber.ClientID) Then %>
        lblName.html('<%=NameCollection(txtIDNumber.ClientID)%>');
    <%Else%>
        lblName.html('<span class="error">Not a User</span>');
    <%End If %>
});
于 2012-12-27T00:16:39.993 回答
0

在这里做你想做的事情的唯一方法是使用 Ajax 或表单。

$('#<%= txtIDNumber.ClientID %>').change(function(){
    var idNumber = $('#<%= txtIDNumber.ClientID %>').val();
    var lblName = $('#<%= lblName.ClientID %>');

    $.ajax({
       "url": "YourServerURLHere",  
       "data":{
           "idNumber":idNumber
       },
       "success": function(data)
       {
          lblName.text(data);
       }
    });
});
于 2012-12-27T00:18:32.710 回答