Вопрос по c#, asp.net, user-controls, webforms – Как получить родительскую страницу из пользовательского элемента управления на веб-сайте ASP.NET (не веб-приложение)

30

Так же, как предмет спрашивает.

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

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

Нет необходимости сохранять ссылку - каждый UserControl уже предоставляет свойство Page. Paul Alexander

Ваш Ответ

9   ответов
2

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

отчасти излишне, хотя ...

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

    return GetParentPage(this.Parent);
}
Это может привести кStackOverFlowException ...
7

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

Label lbl_Test = (Label)Parent.FindControl("lbl_Test");
2

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

0

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

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

РЕДАКТИРОВАТЬ: зависит от того, какое из событий жизненного цикла страницы вы хотите сохранить ссылку и как использовать для хранения этой ссылки. Однако ссылка всегда доступна

62
this.Page

или из любого места:

Page page = HttpContext.Current.Handler as Page
14

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

Это, как говорится, вы можете использоватьthis.Page.

Это прекрасно в идеальном мире, но во многих случаях для частей элемента управления может требоваться условие, зависящее от вызывающей страницы. Хорошим примером является то, что элемент управления используется на каждой странице, и этот элемент управления отображает или регистрирует свою вызывающую страницу (по любой причине, например, внутреннее отслеживание, отладка или даже из соображений безопасности).
это отличный момент. четко определенные пользовательские элементы управления должны быть полностью независимыми от страницы, на которой они находятся.
Хорошим вариантом использования этого является доступ к коллекции Page.Items, которая может использоваться для хранения объектов, которые используются в течение всего цикла обработки страницы Asp.net. Вы можете избежать перезагрузки общих объектов в каждом пользовательском элементе управления.
Если рассматриваемое приложение представляет собой изолированное приложение, и все страницы наследуются от класса BasePage, и вам необходим доступ к этому BasePage, тогда this.Page является полностью приемлемым решением, поскольку все страницы в этом приложении будут наследоваться от этой BasePage, и элемент управления будет быть определены исключительно для этого приложения.
0

а затем назначьте ему метод из родительской страницы.

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

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

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

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");
        }
    }
1

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

        }

Похожие вопросы