【问题标题】:Render Self-Closing Tag in ASP.NET custom control derived from Control在派生自 Control 的 ASP.NET 自定义控件中呈现自关闭标记
【发布时间】:2010-09-20 23:40:47
【问题描述】:

我正在开发 Facebook FBML 控件库,并希望创建类似于 ASP.NET WebControls 库的模式的 FBML 控件。我有一个默认处理渲染的基类;这是我的渲染方法:


        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-set 方法不兼容。不幸的是,如果是这种情况,这也意味着 AddAttributesToRender 模式也不起作用。它实际产生的是这样的:


        <fb:name uid="10300399458">

        </fb:name>

如何获取 HtmlTextWriter(或我需要使用哪个 HtmlTextWriter)以使其呈现自闭合标签?或者,至少,我怎样才能让它不渲染那个中间空间(以便开始和结束标签紧挨着彼此)?

【问题讨论】:

    标签: c# asp.net facebook custom-server-controls


    【解决方案1】:

    由于这是搜索“HtmlTextWriter 自我结束标签”时出现的最重要的 SO 问题,因此适合任何来到这里想知道如何操作的人:

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

    【讨论】:

      【解决方案2】:

      这应该会让你继续前进 - 它将呈现为 &lt;fb:name uid="00101010101"/&gt;。您还可以覆盖 RenderBeginTag、RenderContents、RenderEndTag。根据您正在做的事情,您可能需要在 RenderControl 中进行其他一些操作。您也可以考虑使用 ControlAdapter,这可以让您更好地分离控制功能 VS 控制 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("/>");
      
          }
      }
      

      -杰森

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 为什么?这并不比我的示例代码更紧凑,也没有真正解决我提出的问题。
        【解决方案4】:

        如果您使用 Visual Studio,请按以下步骤操作:

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

        【讨论】:

          猜你喜欢
          • 2010-10-07
          • 2021-05-04
          • 2011-01-27
          • 2011-11-24
          • 1970-01-01
          • 2011-01-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多