我正在尝试将 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);
});