Подтвердить что ты не робот

Вызов метода на родительской странице из пользовательского элемента управления

У меня есть пользовательский элемент управления, зарегистрированный на странице aspx На событие клика кнопки в пользовательском элементе управления, как мне вызвать метод, который есть в родительской странице codebehind?

Спасибо.

4b9b3361

Ответ 1

Вот классический пример использования событий, предложенный Фредди Риосом (С# из проекта веб-приложения). Предполагается, что вы хотите использовать существующий делегат, а не создавать свои собственные, и вы не передаете что-либо конкретное для родительской страницы событиями 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
    }

}

Ответ 2

Переместите страницу как конкретную страницу в вашем проекте:

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

Ответ 3

Я предлагаю, чтобы вы не вызывали метод страницы напрямую, так как вы привязывали бы свой контроль к определенной странице.

Вместо этого опубликуйте событие и подпишитесь на него. Он работает для любого количества страниц, его легче использовать, если элемент управления несколько раз на одной странице (возможно, даже в списке) и больше соответствует дизайну asp.control.

Ответ 5

Следуйте хорошему и соответствующему подходу,

Использовать событие и концепцию делегата сделать делегат той же сигнатурой, что и ваш метод, на родительской странице, а затем присвоить ему родительский метад в событии загрузки родительской страницы, а затем вызвать этот делегат через событие в пользовательском элементе управления.

Пример кода и ссылка приведены ниже.

//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);
 }
}

Подробнее о том, как это работает (Ссылка): -

Вызов метода родительской страницы из пользовательского элемента управления

Ответ 6

Я хочу сделать этот сценарий:

  • Вызвать 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);

   ...
 }

Ответ 7

 //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 

Ответ 8

Вы можете использовать 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;
    }
}

Это намного эффективнее