从用户控件调用父页面中的方法
我有一个用户控件在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事件( btnSave
button名称)中使用此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; } }
这是更有效率