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

时间:2008-11-05 22:32:53

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

我正在开发一个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>

当它为假时,它应该使用自动关闭标记进行渲染:

<fb:name uid="10300399458" />

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


        <fb:name uid="10300399458">

        </fb:name>

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

4 个答案:

答案 0 :(得分:7)

由于这是在搜索“HtmlTextWriter自闭标签”时出现的最重要的问题,这适用于任何想要知道如何操作的人来到这里:

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

答案 1 :(得分: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("/>");

    }
}

-Jason

答案 2 :(得分: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); // "/>"
    }

答案 3 :(得分:-1)

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

  

工具---&gt;选项---&gt;文字编辑器---&gt; HTML ----&gt;格式化---&gt;   删除自动插入关闭标记