防止ASP.NET属性不再显示为自定义控件中的属性

本文关键字:属性 自定义控件 不再 ASP NET 防止 显示 | 更新日期: 2023-09-27 18:07:07

我已经创建了一个自定义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没有出现?

防止ASP.NET属性不再显示为自定义控件中的属性

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

下面是来自reflector的渲染属性实现:

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;
    }
}