Так же, как задается вопрос.
ИЗМЕНИТЬ 1
Возможно, это возможно, когда запрос обрабатывается для хранения ссылки на родительскую страницу в пользовательском элементе управления?
Так же, как задается вопрос.
ИЗМЕНИТЬ 1
Возможно, это возможно, когда запрос обрабатывается для хранения ссылки на родительскую страницу в пользовательском элементе управления?
this.Page
или примерно где угодно:
Page page = HttpContext.Current.Handler as Page
Я не могу придумать какой-либо веской причины для пользовательского элемента управления знать что-либо о странице, на которой он находится, поскольку пользовательский элемент управления должен быть не осведомлен о своем контексте и вести себя предсказуемо, независимо от того, на какой странице он находится.
При этом вы можете использовать this.Page.
вы можете использовать свойство Parent
если вам нужно это, чтобы найти элемент управления на странице, вы можете использовать
Label lbl_Test = (Label)Parent.FindControl("lbl_Test");
Я всегда использовал this.Page в System.Web.UI.UserControl.
Или вы всегда можете сделать рекурсивный вызов родителя, пока не встретите объект, являющийся страницей.
вид overkill, хотя...
protected Page GetParentPage( Control control )
{
if (this.Parent is Page)
return (Page)this.Parent;
return GetParentPage(this.Parent);
}
Я нашел способ сделать это, чтобы создать интерфейс, реализовать этот интерфейс, использовать this.Page, чтобы получить страницу из элемента управления, применить его к интерфейсу, а затем вызвать метод.
Вы должны использовать NamingContainer следующим образом:
try
{
if (!string.IsNullOrWhiteSpace(TargetCtrlID))
{
var ctrl = NamingContainer.FindControl(TargetCtrlID);
if(ctrl != null)
Console.Write("'" + ctrl.ClientID + "'");
}
}
catch
{
}
Каждый элемент управления имеет родительское свойство, которое можно использовать для доступа к родительскому объекту.
protected void Page_Load(object sender, EventArgs e)
{
Response.Write(this.Parent.ID);
}
EDIT: зависит от того, какое из событий жизненного цикла страницы вы хотите сохранить ссылку и что использовать для хранения этой ссылки. Однако ссылка всегда доступна
Создайте делегат в пользовательском элементе управления и затем назначьте ему метод с родительской страницы.
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
}
}
Запись на страницу и мастер-страницу из пользовательского веб-элемента управления. Лично мне нравится, что пользовательские элементы управления свободны, но это можно сделать следующим образом.
Директива, необходимая для 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");
}
}