【问题标题】:Create a custom label that implements IPostBackDataHandler创建实现 IPostBackDataHandler 的自定义标签
【发布时间】:2011-11-18 11:13:23
【问题描述】:

我想创建一个实现 IPostBackDataHandler 的标签,因为我想用 javascript 更改文本。如果我在那之后触发回发,那么我的文本就消失了。

我已有的代码是这样的:

public class CustomLabel : Label, IPostBackDataHandler
{
  protected override void OnPreRender(EventArgs e)
  {
    base.OnPreRender(e);

    if (Page != null)
      Page.RegisterRequiresPostBack(this);
  }

  public bool LoadPostData(string postDataKey, System.Collections.Specialized.NameValueCollection postCollection)
  {
    this.Text = postCollection[postDataKey];
    return true;
  }

  public void RaisePostDataChangedEvent()
  {
    //throw new NotImplementedException();
  }
}

它根本不起作用,我不明白我应该如何看到文本已更改并且 PostCollection[postDataKey] 始终为空。

【问题讨论】:

    标签: asp.net custom-controls custom-server-controls


    【解决方案1】:

    IPostBackDataHandler 接口用于输入。跨度和 div 等元素不会存储在请求对象中。我只会实现必要的 ViewState 管理方法。这是我开发的自定义网格组件的一个示例:

    protected override void LoadViewState(object savedState)
    {
        if (savedState != null)
        {
            object[] state = (object[])savedState;
    
            if (state[0] != null)
                base.LoadViewState(state[0]);
            if (state[1] != null)
                ((IStateManager)ItemStyle).LoadViewState(state[1]);
            if (state[2] != null)
                ((IStateManager)headerStyle).LoadViewState(state[2]);
            if (state[3] != null)
                ((IStateManager)AlternatingItemStyle).LoadViewState(state[3]);
        }
    }
    
    protected override object SaveViewState()
    {
        object[] state = new object[4];
    
        state[0] = base.SaveViewState();
        state[1] = itemStyle != null ? ((IStateManager)itemStyle).SaveViewState() : null;
        state[2] = headerStyle != null ? ((IStateManager)headerStyle).SaveViewState() : null;
        state[3] = alternatingItemStyle != null ? ((IStateManager)alternatingItemStyle).SaveViewState() : null;
    
        return state;
    }
    
    protected override void TrackViewState()
    {
        base.TrackViewState();
    
        if (itemStyle != null)
            ((IStateManager)itemStyle).TrackViewState();
        if (headerStyle != null)
            ((IStateManager)headerStyle).TrackViewState();
        if (alternatingItemStyle != null)
            ((IStateManager)alternatingItemStyle).TrackViewState();
    }
    

    【讨论】:

    • 谢谢,我以为我能够实现 IPostBackDataHandler 但我错了让它工作。我现在要使用一些隐藏字段。
    • 隐藏字段无法解决您的问题。您需要在视图状态中跟踪控件。不过,您已经从 Label 控件继承,所以它应该是相当简单的。
    猜你喜欢
    • 2012-02-29
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-17
    • 2021-02-09
    • 2015-03-12
    • 1970-01-01
    相关资源
    最近更新 更多