wake-up-neo.com

Wie kann ich die übergeordnete Seite von einem Benutzersteuerelement in einer ASP.NET-Website (nicht Webanwendung) abrufen

So wie das Thema fragt.

BEARBEITEN 1

Möglicherweise ist es irgendwann möglich, während der Anforderung eine Referenz auf die übergeordnete Seite im Benutzersteuerelement gespeichert wird.

30
JoeB
this.Page

oder von überall her:

Page page = HttpContext.Current.Handler as Page
62
Paul Alexander

Ich kann mir keinen guten Grund vorstellen, dass ein Benutzersteuerelement etwas über die Seite weiß, auf der es sich befindet, da das Benutzersteuerelement seinen Kontext nicht kennt und sich vorhersagbar verhält, unabhängig davon, auf welcher Seite es sich befindet. 

Davon abgesehen können Sie this.Page verwenden.

14
Andrew Hare

sie können die Parent-Eigenschaft verwenden

wenn Sie dies benötigen, um ein Steuerelement auf der Seite zu finden, können Sie verwenden

Label lbl_Test = (Label)Parent.FindControl("lbl_Test");
7
Josh Mein

Ich habe this.Page immer im System.Web.UI.UserControl verwendet. 

Oder Sie können immer einen rekursiven Aufruf für das übergeordnete Element ausführen, bis Sie auf ein Objekt stoßen, das eine Seite ist.

ein bisschen übertrieben aber ...

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

    return GetParentPage(this.Parent);
}
2
BigBlondeViking

Ich fand den Weg dazu, eine Schnittstelle zu erstellen, diese Schnittstelle zu implementieren, this.Page zu verwenden, um die Seite vom Steuerelement abzurufen, sie in die Schnittstelle umzuwandeln und dann die Methode aufzurufen.

2
JoeB

Sie müssen NamingContainer so verwenden: 

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

        }
1
Hakan KOSE

Jedes Steuerelement verfügt über eine übergeordnete Eigenschaft, mit der Sie auf das übergeordnete Element zugreifen können.

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

BEARBEITEN: Hängt davon ab, welches der Lebenszyklusereignisse der Seite Sie die Referenz speichern möchten, und welche Verwendung diese Referenz haben soll. Die Referenz ist jedoch immer verfügbar 

0
Marco Mangia

Schreiben auf die Seite und die Masterseite aus der Web-Benutzersteuerung: Ich persönlich mag es, dass die Benutzersteuerelemente lose sind, aber es kann so gemacht werden.

Masterseite:

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

Richtlinie für WebForm1 erforderlich: So kann die Seite auf die Masterseite schreiben

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

Methoden schreiben auf Seite und Masterseite:

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

User Control schreibt sowohl auf die Seite als auch auf die Masterseite:

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
Stewart

Erstellen Sie im Benutzersteuerelement einen Delegaten, und weisen Sie ihm auf der übergeordneten Seite eine Methode zu.

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
Nikolay