【发布时间】:2010-11-04 23:06:27
【问题描述】:
正如题主所问。
编辑 1
也许有可能在处理请求时将对父页面的引用存储在用户控件中?
【问题讨论】:
-
没有必要存储引用 - 每个 UserControl 已经公开了一个 Page 属性。
标签: c# asp.net webforms user-controls
正如题主所问。
编辑 1
也许有可能在处理请求时将对父页面的引用存储在用户控件中?
【问题讨论】:
标签: c# asp.net webforms user-controls
this.Page
或来自任何地方:
Page page = HttpContext.Current.Handler as Page
【讨论】:
我想不出有什么好的理由让用户控件知道它所在的页面,因为用户控件应该不知道它的上下文,并且不管它在哪个页面上,它的行为都是可预测的。
话虽如此,您可以使用this.Page。
【讨论】:
您可以使用 Parent 属性
如果你需要这个来在页面上找到一个控件,那么你可以使用
Label lbl_Test = (Label)Parent.FindControl("lbl_Test");
【讨论】:
我总是在 System.Web.UI.UserControl 中使用 this.Page。
或者你总是可以对 Parent 进行递归调用,直到你遇到一个 Page 对象。
虽然有点矫枉过正......
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);
}
编辑: 取决于您要存储引用的页面的哪一个生命周期事件以及存储该引用的用途。但是参考总是可用的
【讨论】:
在用户控件中创建一个委托,然后从父页面为其分配一个方法。
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
}
}
【讨论】:
从 Web 用户控件写入页面和母版页: 我个人喜欢松散的用户控件,但可以这样做。
母版页:
public partial class Second : System.Web.UI.MasterPage
{
public void SecondMasterString(string text)
{
MasterOut.Text += text;
}
}
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");
}
}
【讨论】: