Удаление атрибута класса 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, поэтому я могу ошибаться.