在用户控制上覆盖DataBind,需要注意什么?

时间:2010-09-21 21:01:41

标签: asp.net data-binding user-controls

我在用户控件上有一个自定义属性,它有多个状态/模式。如果在父页面中设置了此属性:我希望我的控件自动更新。在页面加载中使用该属性不起作用,因为它未启动。

我可以想象有3种方法可以做到这一点:

  1. 在属性上,我可以添加一个代码块来调用this.DataBind()。
  2. 我可以通过覆盖虚拟方法DataBind来添加代码。
  3. 我可以创建一个公共专有的Update方法。
  4. 我希望对一般的最佳做法有任何意见。更重要的是,我选择覆盖虚拟方法DataBind。我的伪代码是这样的:

        public override void DataBind()
    {
          if (SpecialMode)
           {
            .. load from database
    
           }
          base.DataBind()
        }
    

    我对base.DataBind()的排序感兴趣。我已经看到它通常放在第一位,但是在我从数据库加载数据之后:我需要数据绑定才能显示数据。

    非常感谢对这些考虑因素的任何投入。

    要明确:

    此控件是一个Poll小部件。它通常会搜索并加载轮询以从Page_Load事件中显示。但是,它还有一个报告模式,允许嵌入控件的页面更改要显示的轮询的ID。此属性不会在Page_Load中启动。好吧,这个混乱的一部分是我有一个对象的属性,我也是ViewState的重复属性,但只有Id。

2 个答案:

答案 0 :(得分:0)

您的控件不应以任何方式依赖于嵌入它的页面。相反,在控件上有一个“AutoUpdate”属性,并让页面设置它。该页面还应设置属性,告知控件在设置AutoUpdate属性时如何更新。

答案 1 :(得分:0)

您可以让您的用户控件在其PreRender事件中处理自动数据绑定。当Id属性被更改时(或者触发自动数据绑定的任何属性),您可以在控件中设置一个标志,稍后在PreRender中检查该标志以指示需要加载数据。

或者,您可以清除已经从ViewState加载的任何数据,并在PreRender中实现逻辑,说明“如果没有数据,则加载它”,而不是设置标志。

这可以避免在单个请求中多次潜在地加载数据,因为恰好存在多次设置Id属性的代码。