Как получить родительскую страницу из пользовательского элемента управления на веб-сайте ASP.NET (не веб-приложение) - PullRequest
30 голосов
/ 22 июня 2009

Так же, как просит субъект.

РЕДАКТИРОВАТЬ 1

Может быть, когда-нибудь во время обработки запроса возможно сохранить ссылку на родительскую страницу в пользовательском элементе управления?

Ответы [ 9 ]

62 голосов
/ 22 июня 2009
this.Page

или откуда угодно:

Page page = HttpContext.Current.Handler as Page
14 голосов
/ 22 июня 2009

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

При этом вы можете использовать this.Page.

7 голосов
/ 22 июня 2009

вы можете использовать родительское свойство

если вам нужно найти элемент управления на странице, вы можете использовать

Label lbl_Test = (Label)Parent.FindControl("lbl_Test");
2 голосов
/ 22 июня 2009

Я нашел способ сделать это - создать интерфейс, реализовать этот интерфейс, использовать this.Page, чтобы получить страницу из элемента управления, привести ее к интерфейсу, а затем вызвать метод.

2 голосов
/ 22 июня 2009

Я всегда использовал эту страницу в System.Web.UI.UserControl.

Или вы всегда можете сделать рекурсивный вызов для Родителя, пока не встретите объект, который является Страницей.

вид излишка, хотя ...

protected Page GetParentPage( Control control )
{
    if (this.Parent is Page)
        return (Page)this.Parent;

    return GetParentPage(this.Parent);
}
1 голос
/ 09 апреля 2012

Вы должны использовать NamingContainer следующим образом:

       try
        {
            if (!string.IsNullOrWhiteSpace(TargetCtrlID))
            {
                var ctrl = NamingContainer.FindControl(TargetCtrlID);
                if(ctrl != null)
                    Console.Write("'" + ctrl.ClientID + "'");
            }
        }
        catch
        {

        }
0 голосов
/ 29 января 2019

Запись на страницу и мастер-страницу из пользовательского веб-элемента управления: Лично мне нравится, что пользовательские элементы управления свободны, но это можно сделать следующим образом.

Мастер-страница:

public partial class Second : System.Web.UI.MasterPage
    {
        public void SecondMasterString(string text)
        {
            MasterOut.Text += text;
        }
    }

Необходима директива для WebForm1: чтобы страница могла писать на главную страницу

<%@  MasterType VirtualPath="~/DemoFolder/MasterPages/Second.master" %>

Методы записи на страницу и мастер-страницу:

public partial class WebForm1 : System.Web.UI.Page
    {
    public void SetPageOutput(string text)
        {
            // writes to page
            this.PageOut.Text = text;
        }

        public void SetMaster(string text)
        {
            // writes to Master Page
            this.Master.SecondMasterString(text);
        }
}

Пользовательский контроль записывает как страницу, так и главную страницу:

public partial class WebUserControl1 : System.Web.UI.UserControl
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            LegoLand.DemoFolder.MasterPages.WebForm1 page = (WebForm1)this.Parent.Page;
            page.SetMaster("** From the control to the master");
            page.SetPageOutput("From the control to the page");
        }
    }
0 голосов
/ 13 декабря 2013

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

class MyUserControl : UserControl
{
   delegate object MyDelegate(object arg1, object arg2, object argN);
   public MyDelegate MyPageMethod;

   public void InvokeDelegate(object arg1, object arg2, object argN)
   {
     if(MyDelegate != null)
        MyDelegate(arg1, arg2, argN); //Or you can leave it without the check 
                                      //so it can throw an exception at you.
   }
}

class MyPageUsingControl : Page
{
   protected void Page_Load(object sender, EventArgs e)
   {
     if(!Page.IsPostBack)
        MyUserContorlInstance.MyPageMethod = PageMethod;
   }

   public object PageMethod(object arg1, object arg2, object argN)
   {
     //The actions I want
   }
}
0 голосов
/ 22 июня 2009

Каждый элемент управления имеет родительское свойство, которое вы можете использовать для доступа к родительскому элементу.

protected void Page_Load(object sender, EventArgs e)
{
  Response.Write(this.Parent.ID);
}

EDIT: зависит от того, какое из событий жизненного цикла страницы вы хотите сохранить ссылку и как использовать для хранения этой ссылки. Однако ссылка всегда доступна

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...