在 ASP.NET WebForms 中,如何在 javascript 代码中模拟单击 asp:LinkButton 并通过代码设置“CommandName”和“CommandArgument”?

问题描述 投票:0回答:2

在服务器端,我有一个 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。

但是它不起作用。正在触发页面“Load”事件,但未触发 LnkCSCommand_Click 事件处理程序。 看起来我没有在 __postBack 调用中正确引用 LnkCSCommand 控件。 我做错了什么?

javascript asp.net webforms
2个回答
0
投票

毫无疑问,这是引用控件的 __doPostBack() 第一个参数中的错误:asp.net WebForms 期望它是一个名称,而不是 ClientID。问题是 LinkButton 控件没有 name 属性(至少它没有在生成的 html 中公开)。 不管怎样,我意识到我不需要使用 LinkButton。所以我用它替换了一个 Button 控件,该控件在生成的 html 中公开 name 属性,这样我就可以使用它......繁荣!服务器 500 错误:“无效的回发或回调参数”。 是的,基本上我是在自我攻击。事件验证禁止我使用未注册的数据以编程方式生成回发。我不想禁用事件验证,所以无论如何我都需要改变我的方法。


0
投票

好的,你所拥有的应该可以工作,但是这里还有一些重要的其他问题。

首先,它通常取决于如何/何时/何地/什么触发 JavaScript 代码。请记住,虽然用户单击按钮可以触发弹出对话框,但用户无需单击页面的 JavaScript 代码则不能(这是为了弹出保护 - 因此,在大多数情况下,只有单击按钮而运行的 JavaScript 代码才能触发页面上的其他按钮代码)。

下一期?

如果您说页面加载或代码后面的任何位置将有问题的控件设置为visible = false?

然后 html 和服务器不会呈现该控件的标记。

所以,说出这个简单的链接按钮:

    <asp:LinkButton ID="LinkButton1" runat="server">LinkButton test</asp:LinkButton>

    <input id="Buttonh" type="button" value="js run"
        onclick="test1();return false" />

    <script>
        function test1() {
            __doPostBack('LinkButton1', '')
        }
    </script>

所以,如果我们点击第二个按钮(一个 html 按钮,然后执行回发来模仿第一个按钮?然后,是的,这会起作用(注意规则 - 我们正在点击一个按钮,所以我们可以触发回发)。

但是,如果在页面加载时我们会这样做:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    If Not IsPostBack Then
        LinkButton1.Visible = False
    End If

End Sub

那么我们的代码就不起作用了,原因如上所述:如果您设置控件的visible属性= false,则该控件不会呈现,也不会发送到客户端浏览器(DOM)。

因此,当相关控件可见 = false 时,任何客户端代码 (JavaScript) 都无法操纵或使用或操纵更改按钮、标记或任何有问题的内容。

解决方案:

上述解决方案是不使用 .visible = false,而是使用 CSS 样式隐藏控件,但仍然允许将其渲染并发送到客户端浏览器的 CSS。

所以,虽然上面的on-load设置链接按钮visible = false不起作用(html按钮点击触发按钮不起作用),但如果我们使用CSS来“隐藏”标记,那么这可以起作用。

因此,这将起作用:

    If Not IsPostBack Then
        LinkButton1.Style.Add("display", "none")
    End If

因此,请记住,使用服务器端代码和“visible = false”意味着此类标记永远不会发送到客户端浏览器,也不会在浏览器中呈现客户端的标记。

但是,使用上述 CSS 隐藏控件意味着标记将发送到客户端浏览器,因此现在 JavaScript 代码可以自由使用、操作或在这种情况下“模仿”该隐藏元素的单击(在本例中为链接按钮) ).

© www.soinside.com 2019 - 2024. All rights reserved.