【问题标题】:Overriding DataBind on User Control, caveats?覆盖用户控件上的 DataBind,注意事项?
【发布时间】:2010-09-21 21:01:40
【问题描述】:

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

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

  1. 在属性上,我可以添加一个调用 this.DataBind() 的代码块。
  2. 我可以通过重写虚拟方法 DataBind 来添加代码。
  3. 我可以创建一个公共专有的更新方法。

我想就一般最佳做法提供任何意见。更重要的是,我选择了重写虚拟方法 DataBind。我的伪代码是这样的:

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

       }
      base.DataBind()
    }

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

我们将不胜感激任何对这些考虑的意见。

要明确:

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

【问题讨论】:

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


    【解决方案1】:

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

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

    这避免了在单个请求中多次加载数据的可能性,因为碰巧有代码多次设置 Id 属性。

    【讨论】:

    • @DrWily 谢谢,这是有道理的。我会等着看我是否有更多的建议。这其中的一些复杂性来自于我使用 ViewState 存储状态数据但仅使用 Id 但为方便起见我还在属性中存储了一个对象,因此当 Id 更改时其他属性应该更改。但第一次,我实际上是从完整对象中加载 Id。所以,除非需要,否则我真的不想加载完整的对象。我现在看到它有点乱。
    【解决方案2】:

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

    【讨论】:

    • @Saunders 这就是我正在做的事情。我将添加说明。
    • @Curtis:首先,使用用户名的开头,例如“@John”。其次,您的控件应该仍然不自行加载数据。看看 DataGrid 控件是如何做到的。此外,如果您没有绑定到数据,则不要使用 DataBind 方法。如果控件的输出基于此属性而不同,则只需覆盖 OnPreRender 或 Render。如果 data 因属性而异,那么页面应该再次说明要使用哪些数据,而不是控件。
    猜你喜欢
    • 1970-01-01
    • 2012-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多