从父ASP.NET页处理用户控件中LinkButton的单击事件
我在用户控件中有一个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页面上,我想处理页面代码背后的点击,而不是在用户控件中。如何从父控件的代码隐藏页重写控件内
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
}
}