У меня есть пользовательский элемент управления, зарегистрированный на странице aspx
На событие клика кнопки в пользовательском элементе управления, как мне вызвать метод, который есть в родительской странице codebehind?
Спасибо.
У меня есть пользовательский элемент управления, зарегистрированный на странице aspx
На событие клика кнопки в пользовательском элементе управления, как мне вызвать метод, который есть в родительской странице codebehind?
Спасибо.
Вот классический пример использования событий, предложенный Фредди Риосом (С# из проекта веб-приложения). Предполагается, что вы хотите использовать существующий делегат, а не создавать свои собственные, и вы не передаете что-либо конкретное для родительской страницы событиями args.
В коде управления пользователя (при необходимости при необходимости адаптируйте код или С#):
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()
Я предлагаю, чтобы вы не вызывали метод страницы напрямую, так как вы привязывали бы свой контроль к определенной странице.
Вместо этого опубликуйте событие и подпишитесь на него. Он работает для любого количества страниц, его легче использовать, если элемент управления несколько раз на одной странице (возможно, даже в списке) и больше соответствует дизайну asp.control.
Скотт Аллен имеет полезную статью о пузырьках событий от пользовательского элемента управления до родительской страницы, в которой подробно описывается ответ Стивен М. Редд:
Следуйте хорошему и соответствующему подходу,
Использовать событие и концепцию делегата сделать делегат той же сигнатурой, что и ваш метод, на родительской странице, а затем присвоить ему родительский метад в событии загрузки родительской страницы, а затем вызвать этот делегат через событие в пользовательском элементе управления.
Пример кода и ссылка приведены ниже.
//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- Добавить a Action
(_LoadEditCategory
)
public Action<int> _LoadEditCategory = null;
<int>
является аргументом int
(CategoryID
).
2- Используйте этот Action
в событии кнопки (btnSave
имя кнопки) следующим образом:
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. Скажем, когда вы нажимаете кнопку в пользовательском элементе управления и когда вы хотите вызвать метод родительской страницы, тогда в обработчике событий нажмите кнопку установить значение как
Session["CallParent"]="someValue";
как кнопка, вернет страницу назад. В случае события 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;
}
}
Это намного эффективнее