在服务器端,我有一个asp:LinkButton控件,我将在未来使其不可见:
<asp:LinkButton ID="LnkCSCommand" runat="server" Text="CSCommand" CommandName="CommandNameTest" CommandArgument="CommandArgumentTest" CssClass="wi_dq_grid_cmd" >
</asp:LinkButton>
我给它挂了一个处理函数:
Private Sub LnkCSCommand_Click(sender As Object, e As EventArgs) Handles LnkCSCommand.Click
Dim i As Integer = 0
End Sub
现在,我希望从客户端JavaScript代码中命中该处理程序:
function mimicLinkButtonClick(LnkCSCommandClientID, commandName, commandArgument) {
__doPostBack(LnkCSCommandClientID, commandName + '$' + commandArgument);
}
其中“LnkCSCommandClientID”具有真实的现有控件的clientID<asp:LinkButton ID="LnkCSCommand" >。
但它不起作用。正在命中页面“Load”事件,但未命中LnkCSCommand_Click事件处理程序。看起来我没有在__postBack调用中正确引用LnkCSCommand控件。我做错了什么?
2条答案
按热度按时间5jvtdoz21#
好吧,你所拥有的应该可以工作,但这里还有一些重要的额外问题。
首先,它通常取决于如何/何时/何地/什么触发JavaScript代码。请记住,虽然用户单击按钮可以触发弹出对话框,但没有用户单击页面的JavaScript代码不能(这是为了弹出保护--因此在大多数情况下,只有作为按钮单击结果运行的JavaScript代码才能触发页面上的其他按钮代码)。
下一个问题?
如果你在页面加载,或者在代码后面的任何地方设置有问题的控件为visible = false?
然后,html和服务器不呈现该控件的标记。
比如这个简单的链接按钮:
所以,如果我们点击第二个按钮(一个html按钮,然后做回发模仿第一个按钮?然后,是的,这将工作(注意规则-我们点击一个按钮,所以我们被允许触发回发)。
但是,如果在页面加载时,我们这样做:
然后我们的代码不工作,原因如上所述:如果您将控件visible property设置为false,则不会呈现该控件,也不会将其发送到客户端浏览器(DOM)。
因此,任何客户端代码(JavaScript)都不能操纵或使用或更改按钮,或标记或任何有问题的控件时,可见=假。
解决方案:
上面的解决方案是不使用.visible = false,而是使用CSS样式来隐藏控件,但仍然允许呈现并发送到客户端浏览器的标记。
所以,虽然上面的on-load设置link button visible = false不会起作用(html按钮点击触发按钮也不会起作用),但是如果我们使用CSS来“隐藏”标记,那么这就可以起作用。
因此,这将起作用:
因此,请记住,使用服务器端代码和“visible = false”意味着这样的标记永远不会发送到客户端浏览器,也不会在浏览器中呈现客户端的标记。因此,任何从客户端JavaScript代码修改或使用该标记的尝试都是不可能的(因为给定控件的标记不存在于浏览器DOM中的客户端)。
然而,用上面的CSS隐藏控件意味着标记被发送到客户端浏览器,因此现在JavaScript代码可以自由使用,操纵或在这种情况下“模仿”该隐藏元素的点击(在本例中为链接按钮)。
然而,没有真实的理由说明为什么这里使用链接按钮?为什么不用普通的纽扣呢?
使用客户端JavaScript,我经常需要代码来单击现有按钮。
所以,这是可行的(我假设这里是jQuery)。
简单按钮:
后面的代码:
请注意,在上面我没有使用“处理程序”。(这意味着我没有双击设计器中的按钮来自动连接按钮,但在标记中,我输入了以下内容:
因此,您可以双击设计器中的按钮,或者您可以键入onclick=(然后空格键,inteli-sense现在将触发)。
这是非常重要的,因为通常你想添加一个点击事件到一个按钮,但如果它是嵌套在一个GridView,Repeater等,那么你不能双击,因此上面解决了如何创建事件。
因此,如上所示,您可以在jQuery中使用控件选择器的.click()方法。同样,在大多数情况下,规则适用(在大多数情况下,单击按钮的代码应该是用户单击页面的结果)。
von4xj4u2#
肯定是__doPostBack()引用控件的第一个参数中的错误:asp.net WebForms希望它是一个名称,而不是一个ClientID。
问题是LinkButton控件没有name属性(至少它没有在生成的html中公开)。
不管怎样,我意识到我不需要使用链接按钮。所以我把它替换成了一个Button控件,它在生成的html中公开了name属性,这样我就可以使用它了。服务器500错误:“无效的回发或回调参数”。
是的,基本上我是在黑我自己。我正在为一个现有的命令生成一个事件,该命令的参数不是由服务器端代码设置的。嗯,听起来很奇怪。让我们更精确:至少对于按钮单击事件,我不能在客户端修改CommandName和CommandArgument,因为事件验证禁止它。看起来这些参数只能在服务器端设置。如果我只是使用按钮的名称和空字符串作为第二个参数调用回发:
然后在后端引发click事件,只有CommandName和CommandArgument显然也是空的。
我不想禁用事件验证,所以无论如何我需要改变我的方法。