渲染ASP.NET中的自定义控件自定义控件派生自控制

问题描述:

我正在研究Facebook FBML控件库,并且想创建一些像ASP.NET WebControls库一样的FBML控件。我有一个默认处理渲染的基类;这里是我的渲染方法:渲染ASP.NET中的自定义控件自定义控件派生自控制


     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>

当它是假的,它应该用自闭标签渲染:

<fb:name uid="10300399458" />

我可以得到“真实”的条件,几乎正常工作,但自闭标签似乎与Render-集实现方法具不兼容DS。不幸的是,如果是这种情况,那么也意味着AddAttributesToRender模式也不起作用。什么它实际上生产是这样的:


     <fb:name uid="10300399458"> 

     </fb:name> 

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

这应该让你走 - 它会渲染为<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("/>"); 

    } 
} 

-Jason

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

为什么?这并不比我的示例代码更紧凑,它也没有真正解决我所问的问题。 – Rob 2011-08-30 05:55:49

因为这是*SO质疑为 “自HtmlTextWriter的结束标记” 进行搜索时出现,这对于任何想来知道该怎么做的人来说:

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

如果你使用Visual Studio去按下列步骤操作:

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