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