Так же, как задается вопрос.
ИЗМЕНИТЬ 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");
}
}