4

我正在开发一个 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 修改渲染 - 如果它是真的,它应该渲染,例如:

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

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

<fb:name uid="10300399458" />

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


        <fb:name uid="10300399458">

        </fb:name>

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

4

4 回答 4

9

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

writer.WriteBeginTag("tag");
writer.WriteAttribute("attribute", "attribute value");
// ... add other attributes here ...
writer.Write(HtmlTextWriter.SelfClosingTagEnd);
于 2014-09-12T17:22:34.577 回答
6

这应该会让你继续前进 - 它将呈现为<fb:name uid="00101010101"/>. 您还可以覆盖 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("/>");

    }
}

-杰森

于 2008-11-06T21:44:33.130 回答
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); // "/>"
    }
于 2011-08-29T12:41:26.440 回答
-1

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

Tools ---> Options ---> Text Editor ---> HTML ----> Formatting ---> remove Auto insert close tag

于 2015-02-26T08:37:28.620 回答