从显示在自定义属性防止ASP.NET控件属性

问题描述:

我创建了一个自定义ASP.NET控件将作为容器作用与特定的包装标签:从显示在自定义属性防止ASP.NET控件属性

class Section : System.Web.UI.HtmlControls.HtmlGenericControl 
{ 
    public string WrapperTag // Simple interface to base-class TagName 
    { 
     get { return base.TagName; } 
     set { base.TagName = value; } 
    } 


    public string BodyStyle 
    { 
     get 
     { 
      object o = ViewState["BodyStyle"]; 
      return (o == null) ? "" : (string)o; 
     } 
     set 
     { 
      ViewState["BodyStyle"] = value; 
     } 
    } 

    protected override void Render(System.Web.UI.HtmlTextWriter writer) 
    { 
     Attributes["style"] = BodyStyle + ";"; 
     base.Render(writer); 
    } 
} 

这工作没有问题,但出于某种原因,BodyStyle属性也显示为HTML输出中的一个属性。所以,如果我使用控制:

<xx:Section runat="server" WrapperTag="div" BodyStyle="background-color:#ffeeaa;"><other stuff /></xx:Section> 

此输出:

<div BodyStyle="background-color:#ffeeaa;" style="background-color:#ffeeaa;"><other stuff HTML output /></div> 

我试图产生输出:

<div style="background-color:#ffeeaa;"><other stuff HTML output /></div> 

我的问题:

  • 为什么BodyStyle显示为HTML属性?
  • 由于出现BodyStyle,为什么不出现WrapperTag

BodyStyle被写出,因为它存在于ViewState中。在OnRender期间,HtmlGenericControl将所有ViewState项添加为属性。 WrapperTag不在ViewState中,因此不会写入属性。 _bag是StateBag。

下面是从反射器的渲染属性的实现:

public void Render(HtmlTextWriter writer) 
{ 
    if (this._bag.Count > 0) 
    { 
     IDictionaryEnumerator enumerator = this._bag.GetEnumerator(); 
     while (enumerator.MoveNext()) 
     { 
      StateItem stateItem = enumerator.Value as StateItem; 
      if (stateItem != null) 
      { 
       string text = stateItem.Value as string; 
       string text2 = enumerator.Key as string; 
       if (text2 != null && text != null) 
       { 
        writer.WriteAttribute(text2, text, true); 
       } 
      } 
     } 
    } 
} 

更改您的代码如下:

private string bodyStyle; 

public string BodyStyle 
{ 
    get 
    { 
     return bodyStyle ?? string.Empty; 
    } 
    set 
    { 
     bodyStyle = value; 
    } 
}