我可以在服务器端标签中使用JavaScript变量吗?

时间:2012-12-27 00:10:00

标签: javascript jquery asp.net

我正在尝试将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页面加载事件的数据,所以虽然我不确定后台发生了什么样的服务器端标记,但我认为数据应该静态存在于该对象中。在最后一次调用服务器时,但该数据的 snapshot 在客户端实际存在(它必须避免回发,对吧?)?因此,我应该能够避免在这里与服务器通信,因为我只访问应该已经在客户端的数据?如果我错了,请纠正我(很高兴),因为我不是一般的JavaScript或网络编程方面的专家,而且我已经能够在服务器端标签上找到很少的正确引用。

$('#<%= 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 个答案:

答案 0 :(得分:3)

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

解析在服务器传递到客户端之前就会发生。

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

ClientIDMode="Static"

例如:

<asp:TextBox ID="txtIDNumber" runat="server" ClientIDMode="Static" /> 

答案 1 :(得分:2)

我认为你对ASP的运作方式感到困惑。当您在服务器上评估<% anything %>之前,在任何事情到达客户端/浏览器之前。评估后,将评估版本的页面发送给客户端;从那时起<% anything %>完全没有意义。

有鉴于此,希望你能理解为什么把你所有的ASP扔到你的JS中根本没有用处:在涉及JS代码的时候已经“为时已晚”。

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

1)传统的HTML表单

2)AJAX请求

两者都有其优点/缺点,并且都要求您在服务器上创建提交点,但是进入完整的详细信息超出了本答案的范围。可以这么说,阅读处理表单提交和使用ASP处理AJAX请求,你应该找到很多可用的材料。

答案 2 :(得分: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 %>
});

答案 3 :(得分: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);
       }
    });
});