从自定义服务器控件中的标记中删除CSS类属性

时间:2008-10-14 14:58:03

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

问候!

我创建了一个自定义按钮类来呈现以下内容:

<span class="btnOrange">
    <input type="submit" id="ctl00_MainContent_m_GoBack" value="Back" name="ctl00$MainContent$m_GoBack"/>
</span>

但是,它会像这样呈现(注意INPUT标记中无关的“class”属性):

<span class="btnOrange">
    <input type="submit" class="btnOrange" id="ctl00_MainContent_m_GoBack" value="Back" name="ctl00$MainContent$m_GoBack"/>
</span>

我的自定义按钮类如下所示:

[ToolboxData(@"<{0}:MyButton runat=server></{0}:MyButton>")]
public class MyButton : Button
{
    public override void RenderBeginTag(HtmlTextWriter writer)
    {
       writer.AddAttribute(HtmlTextWriterAttribute.Class, this.CssClass);   
       writer.RenderBeginTag("span");
       base.RenderBeginTag(writer);
    }

    public override void RenderEndTag(HtmlTextWriter writer)
    {
       writer.RenderEndTag();
       base.RenderEndTag(writer);
    }
}

由于我只需要为SPAN标记设置class属性,是否可以不包含或“清空”INPUT标记的class属性?

3 个答案:

答案 0 :(得分:1)

你可以这样做:

private string _heldCssClass = null;
public override void RenderBeginTag(HtmlTextWriter writer)
{
   writer.AddAttribute(HtmlTextWriterAttribute.Class, this.CssClass);   
   writer.RenderBeginTag("span");
   _heldCssClass = this.CssClass;
   this.CssClass = String.Empty;
   base.RenderBeginTag(writer);
}

public override void RenderEndTag(HtmlTextWriter writer)
{
   writer.RenderEndTag();
   base.RenderEndTag(writer);
   this.CssClass = _heldCssClass;
}

我在方法调用之间在私有变量中保留CssClass属性的原因是为了防止在渲染期间发生副作用。这在你的特定代码中可能并不重要(“CssClass属性真的那么重要 - 后渲染吗?”)但是防止或减少副作用的影响总是一个好主意,例如上面的代码通过消隐来展示财产。

答案 1 :(得分:0)

如何在呈现class开始标记后从writer对象中删除span属性?我不知道ASP,所以我错了。

答案 2 :(得分:0)

而不是调用基本的RenderBegin / RenderEnd方法,它们本身将调用AddAttributesToRender(从而添加类属性),而只是自己呈现输入标记,就像使用span ...一样....