Page_Load Vs Page_Init用于页面中的用户控件

时间:2017-05-21 18:19:41

标签: asp.net webforms

我有一个名为customer.aspx的ASP.NET页面,其中包含一个用户控件customerdetails.ascx。此用户控件从数据库中读取数据并填充一些字段。如果加载成功(如果有一些数据),则用户应该留在页面上。否则,页面应重定向到其他页面。此重定向在容器customer.aspx页面中完成,而不是在控件中。

我应该为customer.aspxcustomerdetails.ascx用于上述逻辑的ASP.NET页面循环事件(Page_Load Vs Page_Init)是什么?

2 个答案:

答案 0 :(得分:1)

我正在重读这篇文章 - http://www.4guysfromrolla.com/articles/092904-1.aspx,旧的,但很好。我认为您应该能够从customer.aspx的Page_Load事件中执行您需要的操作,因为那时用户控件已加载。只需检查用户控件的控件值和重定向,或不。

编辑:

实际上,我认为这取决于。控制概率必须预先加载,这会改变一切。

  

如果我们需要动态添加的控件来维护其视图状态,那么在Load View State阶段之前添加这些控件是至关重要的。也就是说,在加载视图状态之前,这些控件必须存在于页面的控件层次结构中。加载视图状态 - 初始化之前只有一个阶段。这意味着,如果我们希望动态控件保持视图状态,我们必须将它们添加到页面的Init事件中的控件层次结构中。

使用户控件可访问的一种方法(在底部回答):https://forums.asp.net/t/1674095.aspx?Loop+through+User+Controls+in+Content+Page

编辑:

用户控制

<h4>The User Control</h4>
<div>
    <asp:Label ID="lblUserCtrl" runat="server" Text="Label"></asp:Label>
</div>

的.cs

public partial class Testing_Controls_TestCtrl : System.Web.UI.UserControl
{
    // public properties

    public Label lbl
    {
        get { return lblUserCtrl; }
        set { lblUserCtrl = value; }
    }
    public bool isLoaded;

    // end public properties.

    protected void Page_Init(object sender, System.EventArgs e)
    {
        lblUserCtrl.Text = "User ctrl loaded at: " + DateTime.Now;
        isLoaded = true;
    }

    protected void Page_Load(object sender, EventArgs e)
    {
    }
}

容器页面:

注意:即使我从代码加载它,我仍然必须注册控件。

<%@ Register Src="~/Testing/Controls/TestCtrl.ascx" TagPrefix="uc1" TagName="TestCtrl" %>

...etc...

<form id="form1" runat="server">
    <h4>The Container Page</h4>

    <div>
        <asp:Label ID="lblContainerLabel" runat="server" Text="Label"></asp:Label>
    </div>
    <br />
    <hr />
    <asp:PlaceHolder ID="ph1" runat="server"></asp:PlaceHolder>
</form>

的.cs

public partial class Testing_user_control_test : System.Web.UI.Page
{
    private bool ucIsLoaded;

    protected void Page_Init(object sender, System.EventArgs e)
    {
        Testing_Controls_TestCtrl c = (Testing_Controls_TestCtrl)Page.LoadControl("~/Testing/Controls/TestCtrl.ascx");
        ph1.Controls.Add(c);
        c.lbl.Text += "<br />This is text appended to the user control by the container page.";
        ucIsLoaded = c.isLoaded;
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        lblContainerLabel.Text = "Container page loaded at: " + DateTime.Now + "<br />The user control is loaded: " + ucIsLoaded.ToString().ToUpper();
    }
}

答案 1 :(得分:1)

如果你已经确定两个选项都在功能上运行,那么,为了提高性能,你应该更喜欢Page_Init。

如果您可能最终得到重定向,那么您希望让服务器在页面生命周期中尽快进行重定向,以避免在生命周期步骤中使用可能不必要的资源。