Aspx和Ascx生命周期:避免在数据库上进行多重选择

时间:2012-10-10 09:02:58

标签: asp.net ascx

我使用ascx用户控件来管理CRUD o数据库实体。我在我的aspx页面中重用这个userc控件,以readonly模式显示数据库中记录的数据库数据。用户控件内部有一个简单的FormView和一个objectdatasource。

现在,在包含ascx的aspx页面中我必须知道,在asp的DATABIND时间内,用户控件会考虑数据库记录的一些数据。用户控件是aspx页面之后的数据绑定,因此我没有数据。我必须在数据库的aspx页面中进行选择,并在用户控制之后进行相同的选择。

如何优化此流程?

2 个答案:

答案 0 :(得分:1)

ASCX基础事件可能会在您的ASPX基础事件之后触发,但在整个生命周期中,您可以触发自己的事件。

您可以在ASCX上定义一个事件,让您的页面注册到此事件,然后将您的自定义事件从ASCX传播到ASPX,并使用参数中需要的任何数据

粗略的例子(可能无法编译):在ASCX中

public partial YourControl : System.Web.UI.UserControl {
    public event EventHandler MyControlDataBound;
    public void FireMyControlDataBound()
    {
        if (MyControlDataBound!= null)
        {
            MyControlDataBound(this, new EventArgs());
        }
    }

    protected void MyDataBound(object sender, EventArgs e) {
        // ......
        FireMyControlDataBound();
    }
}

并在ASPX中

public partial class MyPage: Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        yourUserControlInstance.MyControlDataBound += HandleYourDataInYourPage;
    }

    protected void HandleYourDataInYourPage(object sender, EventArgs e) {
        // .. do whatever needed in your page, with your data
        // if you have defined a custom Args class that inherits EventArgs, your could collect data here...
    }
}

如果您需要,可以随意创建一个继承EventArgs的类来传递数据

答案 1 :(得分:0)

您可以在Page

的init事件中将参数传递给UserContol
protected override void OnInit(EventArgs e)
{
        base.OnInit(e);
        var control = (UserControl)this.FindControl("UserControlId");
        control.Property = ...;//Pass User Control properties

}