Визуализация самозакрывающегося тега в настраиваемом элементе управления ASP.NET, полученном из элемента управления - PullRequest
4 голосов
/ 06 ноября 2008

Я работаю над библиотекой элементов управления FBML на Facebook и хотел бы создать элементы управления FBML, в некоторой степени аналогичные библиотеке ASP.NET WebControls. У меня есть базовый класс, который обрабатывает рендеринг по умолчанию; вот мой метод рендеринга:


        protected override void Render(HtmlTextWriter writer)
        {
            AddAttributesToRender(writer);

            if (UseXfbmlSemantics)
            {
                writer.RenderBeginTag(ElementName);
                writer.EndRender();
                writer.RenderEndTag();
            }
            else
            {
                writer.RenderBeginTag(ElementName);
                writer.RenderEndTag();
            }
        }

Я хотел бы, чтобы рендеринг был изменен на основе UseXfbmlSemantics - если это правда, он должен рендерить, например:

<fb:name uid="10300399458"></fb:name>

Если значение равно false, оно должно отображаться с самозакрывающимся тегом:

<fb:name uid="10300399458" />

Я могу заставить "истинное" условие работать почти корректно, но самозакрывающийся тег кажется несовместимым с набором методов Render. К сожалению, в этом случае это также означает, что шаблон AddAttributesToRender также не будет работать. Что он на самом деле производит, так это:


        <fb:name uid="10300399458">

        </fb:name>

Как я могу получить HtmlTextWriter (или какой HtmlTextWriter мне нужно использовать), чтобы он отображал самозакрывающийся тег? Или, по крайней мере, как я могу сделать так, чтобы он не отображал этот промежуточный пробел (чтобы открывающий и закрывающий теги были непосредственно рядом друг с другом)?

Ответы [ 4 ]

7 голосов
/ 12 сентября 2014

Поскольку это самый главный вопрос SO, который возникает при поиске «самозакрывающегося тега HtmlTextWriter», он предназначен для всех, кто хочет узнать, как это сделать:

writer.WriteBeginTag("tag");
writer.WriteAttribute("attribute", "attribute value");
// ... add other attributes here ...
writer.Write(HtmlTextWriter.SelfClosingTagEnd);
6 голосов
/ 07 ноября 2008

Это должно привести вас в порядок - оно будет отображаться как <fb:name uid="00101010101"/>. Вы также можете переопределить RenderBeginTag, RenderContents, RenderEndTag. В зависимости от того, что вы делаете, в RenderControl могут происходить и другие вещи, которые вам нужны. Вы также можете изучить использование ControlAdapter, это может дать вам лучшее разделение функциональности контроля и контроля над написанием HTML.

public  class FbName:System.Web.UI.WebControls.WebControl
{

    protected override string TagName
    {
        get
        {
            return "fb:name";
        }
    }

    public override void RenderControl(HtmlTextWriter writer)
    {  
        RenderBeginTag(writer);// render only the begin tag.
        //base.RenderContents(writer);
        //base.RenderEndTag(writer);
    }

    public override void RenderBeginTag(HtmlTextWriter writer)
    {
        writer.Write("<" + this.TagName);
        writer.WriteAttribute("uid", "00101010101");
        writer.Write("/>");

    }
}

* 1005 Джейсон *

3 голосов
/ 29 августа 2011

Я бы рекомендовал использовать константы HtmlTextWriter:

    protected override void Render(HtmlTextWriter writer)
    {
        AddAttributesToRender(writer);
        writer.Write(HtmlTextWriter.TagLeftChar); // '<'
        writer.Write(this.TagName);
        writer.Write(HtmlTextWriter.SpaceChar); // ' '
        writer.WriteAttribute("uid", "00101010101");
        writer.Write(HtmlTextWriter.SpaceChar); // ' '
        writer.Write(HtmlTextWriter.SelfClosingTagEnd); // "/>"
    }
0 голосов
/ 26 февраля 2015

если вы используете Visual studio, выполните следующие действия:

Инструменты ---> Параметры ---> Текстовый редактор ---> HTML ----> Форматирование ---> удалить автоматическую вставку закрыть тег

...