繁体   English   中英

如何从ASP.NET网站(而不是Web应用程序)中的用户控件获取父页面

[英]How can I get the parent page from a User Control in an ASP.NET Website (not Web Application)

正如主题所要求的那样。

编辑1

在处理请求以便在用户控件中存储对父页面的引用时,有时可能会这样吗?

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");
        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM