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.
this.Page
oder von überall her:
Page page = HttpContext.Current.Handler as Page
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.
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");
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);
}
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.
Sie müssen NamingContainer so verwenden:
try
{
if (!string.IsNullOrWhiteSpace(TargetCtrlID))
{
var ctrl = NamingContainer.FindControl(TargetCtrlID);
if(ctrl != null)
Console.Write("'" + ctrl.ClientID + "'");
}
}
catch
{
}
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
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");
}
}
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
}
}