我目前正在使用ASP.NET中的Ajax选项卡控件处理一个项目。我用于该项目的语言是VB.NET。我正试图利用选项卡上的"OnClientClick"事件。我使用数据库中的数据填充选项卡,并使用VB函数实际创建选项卡。VB代码如下:
Protected Sub makeTab(ByVal categoryName As String, ByVal categoryId As String)
Dim label As New Label
label.Text = categoryName
Dim tab As New AjaxControlToolkit.TabPanel
tab.Controls.Add(label)
tab.HeaderText = categoryName
tab.OnClientClick = "display_alert(" + categoryId + ")"
tcResultSet.Tabs.Add(tab)
'Next
For x As Integer = 1 To tcResultSet.Tabs.Count
If tcResultSet.Tabs(tcResultSet.Tabs.Count - x).HeaderText = "Tab0" Then tcResultSet.Tabs.RemoveAt(tcResultSet.Tabs.Count - x)
Next
End Sub
对于数据库返回的每条记录,都会调用此函数。
在ASPX页面中,选项卡容器为:
<asp:ToolkitScriptManager ID="ToolkitScriptManager1" runat="server" EnablePartialRendering="true" />
<asp:TabContainer ID="tcResultSet" runat="server" AutoPostBack="true" ScrollBars="auto" >
<asp:TabPanel ID="tbTab0" runat="server" HeaderText="Tab0" />
</asp:TabContainer>
我的javascript函数是:
<script type="text/javascript" >
function display_alert(categoryNumber) {
window.alert("Hello! You clicked a tab");
}
</script>
它被放在我的页头里面,在页面的顶部。正如您所看到的,我目前甚至没有在Javascript函数中使用我的变量,但我会的。目前,此代码不起作用。如果我从Javascript函数定义中删除变量,并且(从VB中)调用类似"display_alert"的Javascript函数,它就会工作。如果我在函数名后面加上"()",它将不起作用。有办法解决这个问题吗?有什么办法让它正常工作吗?
我认为客户对该应用程序的规范需要AJAX选项卡,在与他们交谈后,他们对其他选项持开放态度。现在,我正在动态地创建HTML按钮,并且能够以这种方式毫无问题地调用我的Javascript。问题已解决。
附加到OnClientClick的事件处理程序不能有参数。为了使其正常工作,您需要将代码封装在一个函数中,例如在Javascript中是
tab.OnClientClick = function () {alert('my message here');}
这也适用于标记,类似
<asp:TabPanel ID="myTab" runat="server" OnClientClick="function (){alert('this works');}">
我认为这与事件处理程序的签名有关。当分配给OnClientClick
时,您的事件处理程序将被标记到"引擎盖下"的现有事件处理程序上——如果它们没有相同的签名,则会出现运行时错误。