net example asp c# asp.net facebook custom-server-controls

c# - example - oauth 2.0 asp net web api



Renderizar etiqueta de cierre automático en control personalizado ASP.NET derivado de Control (4)

Estoy trabajando en una biblioteca de controles FBML de Facebook y me gustaría crear mis controles FBML modelados en cierto modo como la biblioteca ASP.NET WebControls. Tengo una clase base que maneja la representación 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 la representación se modifique en función de UseXfbmlSemantics; si es cierto, debería representar, 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 hacer que la condición "verdadera" funcione de manera casi correcta, 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á. 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 hacer que represente una etiqueta de cierre automático? O, al menos, ¿cómo puedo hacer que no represente ese espacio temporal (de modo que las etiquetas de apertura y cierre se encuentren inmediatamente una al lado de la otra)?


Esto debería ayudarte: se mostrará 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 podría considerar el uso de un Adaptador de control, esto puede brindarle una mejor separación de la funcionalidad de control VS de escritura 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


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


Dado que esta es la principal pregunta de SO que surge al buscar "etiqueta de cierre automático HtmlTextWriter", esto es para cualquiera que venga y desee saber cómo hacerlo:

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


si usa Visual Studio, siga estos pasos:

Herramientas ---> Opciones ---> Editor de texto ---> HTML ----> Formateo ---> eliminar Insertar etiqueta de cierre automático