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

我有一个用户控件在aspx页面中注册在用户控件中的button的单击事件,我如何调用父页面的代码隐藏的方法?

谢谢。

以下是使用Freddy Rios(来自Web应用程序项目的C#)build议的事件的经典示例。 这假设你想要使用现有的委托,而不是自己做,而且你没有通过事件parameter passing任何特定于父页面的东西。

在用户控件的代码隐藏中(如果不使用代码隐藏或C#,则根据需要进行调整):

public partial class MyUserControl : System.Web.UI.UserControl { public event EventHandler UserControlButtonClicked; private void OnUserControlButtonClick() { if (UserControlButtonClicked != null) { UserControlButtonClicked(this, EventArgs.Empty); } } protected void TheButton_Click(object sender, EventArgs e) { // .... do stuff then fire off the event OnUserControlButtonClick(); } // .... other code for the user control beyond this point } 

在页面本身,你可以用这样的方式订阅事件:

 public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { // hook up event handler for exposed user control event MyUserControl.UserControlButtonClicked += new EventHandler(MyUserControl_UserControlButtonClicked); } private void MyUserControl_UserControlButtonClicked(object sender, EventArgs e) { // ... do something when event is fired } } 

将页面转换为项目中的特定页面:

 ((MyPageName)this.Page).CustomMethod() 

我build议你不要直接调用页面方法,因为你将把你的控件绑定到特定的页面。

而是暴露一个事件,并让页面订阅它。 它适用于任意数量的页面,当控件在单个页面上多次(甚至可能在列表中)时更容易使用,而且更符合asp.controldevise。

斯科特·艾伦(Scott Allen)提供了一篇关于从用户控件到父页面的事件冒泡的有用文章,其中详细阐述了由Stephen M. Redd提供的答案:

  • ASP.NET中Web用户控件的事件冒泡(C#)

遵循好的和适当的方法,

使用事件和委托概念使委托与您的方法在父页面中的签名相同,然后在父页面加载事件中为其指定父代,然后在用户控件中通过事件调用该代理。

代码示例和链接如下。

 //Parent Page aspx.cs part public partial class getproductdetails : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { ucPrompt.checkIfExist += new uc_prompt.customHandler(MyParentMethod); } bool MyParentMethod(object sender) { //Do Work } } //User control parts public partial class uc_prompt : System.Web.UI.UserControl { protected void Page_Load(object sender, EventArgs e) { } public delegate bool customHandler(object sender); public event customHandler checkIfExist; protected void btnYes_Click(object sender, EventArgs e) { checkIfExist(sender); } } 

阅读更多细节如何工作(参考): –

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

我想要做这个场景:

  • 调用LoadEditCategory方法(父方法)。
  • 父方法( LoadEditCategory )需要一个int参数( CategoryID )。
  • 子用户控件是在同一父页面文件夹中的RightControlPanel

子用户控件

1-添加一个Action_LoadEditCategory

public Action<int> _LoadEditCategory = null;

<int>int参数( CategoryID )。

2-在button事件( btnSavebutton名称)中使用此Action ,如下所示:

 void btnSave_Click(object sender, EventArgs e) { //123 is test integer for CategoryID _LoadEditCategory(123); } 

父页面或父级用户控件

3-添加父方法

  private void LoadEditCategory(int CategoryID) { // CategoryID is 123 in my example //Do some things with CategoryID } 

4-加载子代用户控件( RightControlPanel )时添加此代码

 //Load child user control RightControlPanel si = this.LoadControl(this.ControlPath + "RightControlPanel.ascx") as RightControlPanel; if (si != null) { ... //For call parent method in child user control si._LoadEditCategory = c => LoadEditCategory(c); ... } 
  //c# //In parent page public void test(string S) { Label1.Text = S; } //In user control protected void Button1_Click(object sender, System.EventArgs e) { //Calling "test method" of parent page from user control ((object)this.Page).test("Hello!!"); } 'VB.Net 'In parent page Sub test(ByVal S As String) Label1.Text = S End Sub 'In user control Protected Sub Button1_Click(sender As Object, e As System.EventArgs) Handles Button1.Click 'Calling "test method" of parent page from user control DirectCast(Me.Page, Object).test("Hello!!") End Sub 

你可以使用Session。 说你点击用户控件中的一个button,当你想调用父页面方法,然后在button的事件处理程序中点击设置值为

 Session["CallParent"]="someValue"; 

因为button将回发页面。 在父页的Page_Load事件中添加它

 protected void Page_Load(object sender,EventArgs e) { if(Session["CallParent"]!=null) { // here call the Parent Page method Method1(); // now make the session value null Session["CallParent"]=null; } } 

这是更有效率