Ничего из свойства TagKey () - PullRequest
0 голосов
/ 20 августа 2009

Я пишу пользовательский составной элемент управления ASP.NET (наследует System.Web.UI.WebControls.CompositeControl).

По умолчанию мой элемент управления разметки визуализируется в окружении тегов. Я знаю, что могу переопределить свойство TagKey, чтобы установить возвращение в качестве любого тега, который я хочу из перечисления System.Web.UI.HtmlTextWriterTag.

Мой вопрос: могу ли я сделать свой управляющий рендер без добавления разметки .NET?


ОБНОВЛЕНИЕ (02.03.2011) Спасибо Свати за ваш ответ. Я хочу показать, как я решаю свой вопрос сейчас. Я думаю, что я буду интегрировать некоторые идеи Свати. В частности, AddAttributestoRender (), но мне интересно, если это необходимо, так как CompositeControl будет не иметь родительский тег разметки для хранения атрибутов.

Когда мне не нужен содержащий тег разметки, я переопределяю одно свойство и два метода из CompositeControl.

Protected Overrides ReadOnly Property TagKey() As System.Web.UI.HtmlTextWriterTag
    Get
        ' System defaults return as HtmlTextWriterTag.Span
        Return HtmlTextWriterTag.Unknown
    End Get
End Property

Public Overrides Sub RenderBeginTag(ByVal writer As System.Web.UI.HtmlTextWriter)
    If Me.TagKey <> HtmlTextWriterTag.Unknown Then
        MyBase.RenderBeginTag(writer)
    End If
End Sub

Public Overrides Sub RenderEndTag(ByVal writer As System.Web.UI.HtmlTextWriter)
    If Me.TagKey <> HtmlTextWriterTag.Unknown Then
        MyBase.RenderBeginTag(writer)
    End If
End Sub

Ответы [ 3 ]

2 голосов
/ 20 августа 2009

Можно избавиться от содержащего тега с помощью CompositeControl, но он работает против того, как CompositeControl любит работать (см. Ниже)

Правильный способ, по-видимому, установить TagKey на то, чем на самом деле является основной тег вашего элемента управления (div, таблица или что-то еще).

Затем переопределите AddAttributesToRender (), чтобы установить нужные атрибуты для тега-обертки.

Вещи, которые вы хотите внутри оберточных тегов, должны отображаться путем переопределения метода RenderContents ().

CompositeControl наследуется от WebControl, см. Обсуждение пользователя TagKey и AddAttributesToRender () здесь.

Кто-то в GeeksWithBlogs пишет об аналогичной проблеме здесь

Чтобы просто избавиться от переноса, см. Это сообщение на форуме , в котором показан способ переопределения конструктора элемента управления и методов RenderBeginTag и RenderEndTag для удаления тегов переноса.

1 голос
/ 01 марта 2011

Используйте RenderBeginTag. «RenderBeginTag» вызывает другой метод, «AddAttributestoRender», для работы со всеми типами «атрибутов», связанных только с открывающими тегами. «TagKey» соответствует HTML-тегу по умолчанию, соответствующему веб-элементу управления. Если мы реализуем наши собственные теги в методе «RenderBegintag», мы можем просто забыть о проблеме «TagKey». Вы можете сделать что-то вроде этого ..

Public virtual void RenderBeginTag(HtmlTextWriter Writer)
{
  AddAttributestoRender(writer);
  HtmlTextWriterTag tagKey = TagKey;
  If(tagKey != HtmlTextWriterTag.Unknown)
    Writer.RenderBeginTag(tagKey);
  Else
    Writer.RenderBeginTag(this.tagName);
}
0 голосов
/ 20 августа 2009

Не могли бы вы просто переопределить метод Render(), заставив его отображать только содержимое? Может быть, что-то вроде этого поможет:

public override void Render(HtmlTextWriter writer)
{
    RenderContents(writer);
}
...