Tak jak pyta.Jak uzyskać stronę nadrzędną z Kontroli użytkownika w witrynie ASP.NET (nie aplikacji internetowej)?
EDIT 1
Może to możliwe kiedyś, gdy żądanie jest przetwarzane do przechowywania odwołanie do strony nadrzędnej w kontroli użytkownika?
Tak jak pyta.Jak uzyskać stronę nadrzędną z Kontroli użytkownika w witrynie ASP.NET (nie aplikacji internetowej)?
EDIT 1
Może to możliwe kiedyś, gdy żądanie jest przetwarzane do przechowywania odwołanie do strony nadrzędnej w kontroli użytkownika?
this.Page
lub po prostu wszędzie:
Page page = HttpContext.Current.Handler as Page
można użyć właściwości Parent
jeśli trzeba to znaleźć kontrolę na stronie można użyć
Label lbl_Test = (Label)Parent.FindControl("lbl_Test");
Nie mogę wymyślić żadnego powodu, dla którego kontrola użytkownika mogłaby wiedzieć cokolwiek o stronie, na której się znajduje, ponieważ kontrola użytkownika powinna być ignorować jego kontekst i zachowywać się w sposób przewidywalny niezależnie od strony, na której się znajduje.
W związku z tym można użyć this.Page
.
to świetny punkt. dobrze zdefiniowane elementy sterowania użytkownika powinny być całkowicie niezależne od strony, na której się znajdują. – jtate
Jeśli dana aplikacja jest aplikacją silo i wszystkie strony dziedziczą z klasy BasePage i musisz uzyskać dostęp do BasePage, to ta strona jest całkowicie akceptowalnym rozwiązaniem, ponieważ wszystkie strony w tej aplikacji odziedziczą po tej stronie Base i kontroli. zostaną zdefiniowane wyłącznie dla tego wniosku. – cavillac
Dobrym przykładem jest to, aby uzyskać dostęp do kolekcji Page.Items, która może być używana do przechowywania obiektów używanych przez cały cykl przetwarzania stron Asp.net. Możesz uniknąć ponownego ładowania wspólnych obiektów w każdym kontrolerze użytkownika. – humbads
Każdy element sterujący ma właściwość nadrzędną, której można użyć do uzyskania dostępu do obiektu nadrzędnego.
protected void Page_Load(object sender, EventArgs e)
{
Response.Write(this.Parent.ID);
}
EDIT: zależy na którym jednym z wydarzeń cyklu życia strony, którą chcesz zapisać odwołanie i po co, żeby zachować odniesienie. Jednak odniesienie jest zawsze dostępne:
Zawsze używałem tej strony w System.Web.UI.UserControl.
Albo zawsze możesz wykonać rekursywne połączenie z rodzicem, aż napotkasz obiekt będący stroną.
rodzaju przesada chociaż ...
protected Page GetParentPage(Control control)
{
if (this.Parent is Page)
return (Page)this.Parent;
return GetParentPage(this.Parent);
}
Może to spowodować 'StackOverFlowException' ... – Moumit
Znalazłem sposób to zrobić jest stworzenie interfejsu, wdrożenia tego interfejsu, należy this.Page aby uzyskać stronę z kontrolą, miotać interfejsu, a następnie wywołaj metodę.
Musisz użyć NamingContainer tak:
try
{
if (!string.IsNullOrWhiteSpace(TargetCtrlID))
{
var ctrl = NamingContainer.FindControl(TargetCtrlID);
if(ctrl != null)
Console.Write("'" + ctrl.ClientID + "'");
}
}
catch
{
}
Tworzenie delegata w kontroli użytkownika, a następnie przypisać mu metodę od strony nadrzędnej.
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
}
}
Nie ma potrzeby przechowywania odwołania - każdy UserControl już ujawnia właściwość Page. –