Удаление атрибута класса CSS из тега в пользовательском элементе управления сервером

Привет!

Я создал пользовательский класс кнопок для отображения следующего:

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

Однако вместо этого он выглядит так (обратите внимание на посторонний атрибут "class" в теге INPUT):

<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, возможно ли не включать или "исключать" атрибут класса для тега INPUT?

3 ответа

Решение

Вы можете сделать это:

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 действительно важно -after-рендеринга?"), Но всегда полезно предотвращать или уменьшать влияние побочных эффектов, таких как то, что демонстрирует код выше, путем исключения недвижимость.

Вместо того, чтобы вызывать базовые методы RenderBegin/RenderEnd, которые сами вызовут AddAttributesToRender (тем самым добавляя атрибут class), просто визуализируйте входной тег самостоятельно, как вы делаете с span....

Как насчет удаления class атрибут из writer объект после рендеринга span начать тег? Я не знаю ASP, поэтому я могу ошибаться.

Другие вопросы по тегам