从父ASP.NET页面处理用户控件中LinkButton的单击事件

3

我有一个用户控件中的LinkButton,已经处理了:

Private Sub LoginLinkLinkButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles LoginLinkLinkButton.Click
        Response.Redirect("/", True)
End Sub

在一些ASPX页面中,我希望在页面的代码后台处理点击事件,而不是在用户控件内部处理。我该如何在父级代码后台覆盖控件内部的处理程序?
更新: 根据答案,我已经更新了用户控件:
Public Event LoginLinkClicked As OnLoginClickHandler
Public Delegate Sub OnLoginClickHandler(ByVal sender As Object, ByVal e As EventArgs)

[...]

Private Sub LoginLinkLinkButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles LoginLinkLinkButton.Click
        **If OnLoginClickHandler IsNot Nothing Then**
            RaiseEvent LoginLinkClicked(Me, e)
        Else
            Response.Redirect("/", True)
        End If
End Sub

问题在于确定if行的正确语法,因为上述语法无效。


我不确定是否可能,但你可以考虑将逻辑分离到一个中央类中,然后在ASPX和ASCX事件处理程序中调用它。 - TimS
我更新了我的回答,这个翻译对您的更新有效吗? - djdd87
我不确定那会不会有帮助,基本上我想定义一个默认行为,在一些页面上覆盖默认行为。归根结底,就是找到一种在 VB.NET 中查询处理程序是否有订阅者的方法。 - Josh
2个回答

3

您需要从用户控件中公开一个新事件。很抱歉,以下代码全部使用C#编写,而且我已经很久没有接触VB.Net了,但您应该能理解:

您可以通过将以下内容添加到UserControl来使用委托事件:

public event OnLoginClickHandler LoginClick;
public delegate void OnLoginClickHandler (object sender, EventArgs e);

然后在您的 LinkButton 的 Click 事件中调用以下内容:

protected void LoginLinkLinkButton_Click(object sender, EventArgs e)
{
    // Only fire the event if there's a subscriber
    if (OnLoginClickHandler != null) 
    {
        OnLoginClickHandler(sender, e); 
    }
    else
    {
        // Not handled, so perform the standard redirect
        Response.Redirect("/", true);
    }
}

然后您只需在aspx标记中连接到此内容:

<asp:LinkButton runat="server" ID="Foo" OnLoginClick="Foo_LoginClick" />

您的页面上的服务器端事件处理程序将如下所示:

protected void Foo_LoginClick_Click(object sender, EventArgs e)
{
    // This event was fired from the UserControl
}

更新

我认为这是如何将事件订阅检查翻译成VB.Net的:

If LoginClick IsNot Nothing Then
    RaiseEvent LoginClick(sender, e) 
End If 

好的解决方案。我在翻译 if (OnLoginClickHandler != null) { OnLoginClickHandler(sender, e); } 时遇到了困难。我会在问题中发布我的翻译。 - Josh
这会产生以下错误:'OnLoginClickHandler' 是一种类型,不能用作表达式。 - Josh
我也尝试了这个,但是收到了这个错误信息:'Public Event LoginClick(sender As Object, e As System.EventArgs)' 是一个事件,不能直接调用。请使用 'RaiseEvent' 语句来触发事件。 - Josh
@Josh - 再次更新。我错过了RaiseEvent调用。 - djdd87
问题在于您无法测试登录单击事件返回“Nothing”。根据研究,看起来VB.NET不像C#那样容易公开订阅者。由于时间紧迫,我必须在没有默认值的情况下实现。我将把这个标记为已回答,因为您已经回答了如何从父页面调用事件的主要问题。感谢您的帮助。 - Josh
@Josh - 应该可以工作。请参考这个例子:http://www.cynotwhynot.com/blog/post/Dont-Blindly-Raise-Events-in-VBNET.aspx - djdd87

1
我认为你应该查看以下代码和链接。
Parent Page aspx.cs part

public partial class getproductdetails : System.Web.UI.Page
{
 protected void Page_Load(object sender, EventArgs e)
 {
  Button btnYes = (Button)ucPrompt.FindControl("btnYes");
  btnYes.Click += new EventHandler(ucPrompt_btnYes_Click);
 }

 void ucPrompt_btnYes_Click(object sender, EventArgs e)
  {
    //Do Work
  }
}

详细了解它是如何工作的(参考):-

在ASP.NET中处理用户控件的事件

从用户控件调用父页面的方法


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接