Pregunta

Estoy trabajando en una biblioteca de controles FBML de Facebook y me gustaría crear mis controles FBML con un patrón similar al de la biblioteca ASP.NET WebControls. Tengo una clase base que maneja el renderizado por defecto; aquí está mi método de renderizado:


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

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

Lo que me gustaría es que el renderizado se modifique en función de UseXfbmlSemantics; si es cierto, debería renderizar, por ejemplo:

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

Cuando es falso, debe mostrarse con una etiqueta de cierre automático:

<fb:name uid="10300399458" />

Puedo obtener " true " condición para funcionar casi correctamente, pero la etiqueta de cierre automático parece ser incompatible con el conjunto de métodos Render. Desafortunadamente, si ese es el caso, también significa que el patrón AddAttributesToRender tampoco funcionaría. Lo que en realidad está produciendo es esto:


        <fb:name uid="10300399458">

        </fb:name>

¿Cómo puedo obtener HtmlTextWriter (o qué HtmlTextWriter necesito usar) para que muestre una etiqueta de cierre automático? O, al menos, ¿cómo puedo hacer que no represente ese espacio intermedio (de modo que las etiquetas de apertura y cierre estén inmediatamente una al lado de la otra)?

¿Fue útil?

Solución

Esto debería ponerlo en marcha: se representará como <fb:name uid="00101010101"/>. También puede anular RenderBeginTag, RenderContents, RenderEndTag. Dependiendo de lo que esté haciendo, puede haber otras cosas en RenderControl que necesite. También puede considerar el uso de un ControlAdapter, esto puede brindarle una mejor separación de la funcionalidad de control VS escritura de HTML de control.

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("/>");

    }
}

-Jason

Otros consejos

Dado que esta es la pregunta SO principal que aparece cuando se busca " Etiqueta de cierre automático HtmlTextWriter " ;, esto es para cualquiera que venga aquí y quiera saber cómo hacerlo:

writer.WriteBeginTag("tag");
writer.WriteAttribute("attribute", "attribute value");
// ... add other attributes here ...
writer.Write(HtmlTextWriter.SelfClosingTagEnd);

Recomiendo usar constantes 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); // "/>"
    }

si usa Visual Studio, siga estos pasos:

  

Herramientas --- > Opciones --- & Gt; Editor de texto --- & Gt; HTML ---- & Gt; Formateo --- & Gt;   eliminar etiqueta de cierre de inserción automática

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top