Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从父ASP.NET页处理用户控件中LinkButton的单击事件_Asp.net_User Controls - Fatal编程技术网

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

从父ASP.NET页处理用户控件中LinkButton的单击事件,asp.net,user-controls,Asp.net,User Controls,我在用户控件中有一个LinkButton,它处理了: Private Sub LoginLinkLinkButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles LoginLinkLinkButton.Click Response.Redirect("/", True) End Sub 在某些ASPX页面上,我想处理页面代码背后的点击,而不是在用户控件中。如何从父控件的代码隐藏页重写控件内

我在用户控件中有一个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行的正确语法,因为上述内容无效。

您必须从用户控件中公开一个新事件。很抱歉,以下代码都在C#中,而且我已经很久没有接触VB.Net了,但您应该明白了:

您可以通过向
用户控件添加以下内容来使用委托事件:

public event OnLoginClickHandler LoginClick;
public delegate void OnLoginClickHandler (object sender, EventArgs e);
然后调用以下链接按钮
单击事件:

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" />
更新

我认为这就是将事件订阅检查转换为VB.Net的方式:

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

我想你应该看看下面的代码和链接

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
  }
}
阅读更多有关其工作原理的详细信息(参考):-


我不确定这是不是可能的,但是你当然可以考虑把逻辑分成你的ASPX和ASCX事件处理程序都调用的一个中心类。我更新了我的答案。这对您的更新有效吗?我不确定这是否会有帮助,基本上我想定义一个默认行为,并在一些页面上覆盖默认行为。它归结为找到一种查询处理程序在VB.NET.Good solution中是否有订户的方法。如果(OnLoginClickHandler!=null){OnLoginClickHandler(sender,e);}我将发布我在问题中的内容,我在翻译时遇到问题。这会产生以下错误:“OnLoginClickHandler”是一个类型,不能用作表达式。我也尝试过,并收到此错误:“Public Event LoginClick”(发送方作为对象,e作为System.EventArgs)'是一个事件,不能直接调用。使用'RaiseEvent'语句来引发事件。@Josh-再次更新。我错过了
RaiseEvent
调用。问题是你不能免费测试LoginClick。根据研究,VB.NET看起来不像C#那样容易暴露订阅者。我在没有实现的情况下,时间紧迫默认设置。我将此标记为已回答,因为您回答了有关如何从父页面调用事件的主要问题。感谢您的帮助。
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
  }
}