1

我们的网站解决方案中有许多 asp.net 自定义服务器控件。其中大部分是从 DropDownList 继承、调用存储过程并绑定到结果的类文件。现在我正在尝试优化它们,但很难找出最好的工作地点。

这里的目标是执行数据库查询零次或一次。

零:某些具有自定义服务器控件的页面实际上最终会根据某些变量在页面加载时隐藏它们。因此,如果我将绑定代码放在控件的页面加载(或页面初始化)中,即使托管页面从不显示它,它也会触发,如果不需要,我不想执行查询工作。

一:所以,我已经尝试通过覆盖控件中的 RenderContents 事件来进行绑定。这似乎解决了如果托管页面隐藏控件,则该事件不会触发的问题。但是,如果控件在页面可见,则它会触发并且控件绑定。但是......它也会在每次回发时触发,我只想进行一次数据库查询。因此,通常,在第一次通过时,我会将 DataTable 存储在 ViewState 中,然后随后使用它。

但我的测试表明,如果我在 RenderContents 方法中设置 ViewState,那么它似乎在后续回发中不存在(参见下面的代码示例)。并且每次都会发生数据库查找(这是我试图避免的)。

我假设在页面事件生命周期中为时已晚,.NET 无法注意到它。

任何指导将不胜感激!

protected override void RenderContents(System.Web.UI.HtmlTextWriter writer)
    {
        buildList();
        base.RenderContents(writer);
    }

    private void buildList()
    {
        DataTable dt;

        if (ViewState["data"] == null)
        {
            dt = GetData();         // assume this executes a stored proc on SQL Server and returns a DataTable of results
            ViewState["data"] = dt;
        }
        else
        {
            dt = (DataTable)ViewState["data"];
        }

        this.DataSource = dt;
        this.DataTextField = "Description";
        this.DataValueField = "ID";
        this.DataBind();
    }
4

0 回答 0