代码之家  ›  专栏  ›  技术社区  ›  Rob

在ASP.NET中渲染自闭标签。NET自定义控件派生自控件

  •  4
  • Rob  · 技术社区  · 17 年前

    我正在开发一个Facebook FBML控件库,我想创建一个有点像ASP模式的FBML控件。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>

    当它为false时,它应该呈现一个自闭标签:

    <fb:name uid="10300399458" />

    我可以让“true”条件几乎正常工作,但自闭标签似乎与Render方法集不兼容。不幸的是,如果是这样的话,这也意味着AddAttributesToRender模式也不起作用。它实际生产的是:

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

    我如何让HtmlTextWriter(或我需要使用哪个HtmlTextWriter)使其呈现自闭标签?或者,至少,我怎么能让它不渲染那个临时空间(这样开头和结尾标签就可以紧挨着)?

    4 回复  |  直到 17 年前
        1
  •  6
  •   Jason Hernandez    17 年前

    由于这是搜索“HtmlTextWriter自闭标签”时出现的最重要的SO问题,因此这是为任何想知道如何做到这一点的人准备的:

    writer.WriteBeginTag("tag");
    writer.WriteAttribute("attribute", "attribute value");
    // ... add other attributes here ...
    writer.Write(HtmlTextWriter.SelfClosingTagEnd);
    
        2
  •  7
  •   Tony    11 年前

    这应该能让你开始——它将呈现为 <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("/>");
    
        }
    }
    

    -杰森

        3
  •  3
  •   user917829    14 年前

    我建议使用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
  •  -1
  •   Med.Amine.Touil    11 年前

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

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

    推荐文章