从Control派生的ASP.NET自定义控件中渲染自闭合标记

我正在开发一个Facebook FBML控件库,并希望创建我的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修改渲染 – 如果它是真的,它应该渲染,例如:

  

当它为假时,它应该使用自闭标签呈现:

  

我可以让“真实”条件几乎正确地工作,但是自动关闭标签似乎与Render-方法集不兼容。 不幸的是,如果是这种情况,它也意味着AddAttributesToRender模式也不起作用。 它实际产生的是:

   

我怎样才能获得HtmlTextWriter(或者我需要使用哪个HtmlTextWriter)来使它呈现一个自动关闭的标签? 或者,至少,我怎样才能使它不呈现临时空间(以便开始和结束标签紧挨着彼此)?

这应该让你去 – 它将呈现为 。 您还可以覆盖RenderBeginTag,RenderContents和RenderEndTag。 根据您正在做的事情,您可能需要在RenderControl中进行其他一些操作。 你也可以考虑使用ControlAdapter,这可能会让你更好地分离控制functionVS控制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("/>"); } } 

-Jason

由于这是搜索“HtmlTextWriter自闭标签”时出现的最重要的问题,因此这对于想要知道如何操作的人来说是这样的:

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

我建议使用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); // "/>" } 

如果您使用Visual Studio,请执行以下步骤:

工具—>选项—>文本编辑器—> HTML —->格式化—>删除自动插入关闭标记