Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Render Self-Closing Tag in ASP.NET custom control derived from Control

I'm working on a Facebook FBML controls library and would like to create my FBML controls somewhat patterned like the ASP.NET WebControls library. I have a base class that handles rendering by default; here's my render method:


        protected override void Render(HtmlTextWriter writer)
        {
            AddAttributesToRender(writer);

            if (UseXfbmlSemantics)
            {
                writer.RenderBeginTag(ElementName);
                writer.EndRender();
                writer.RenderEndTag();
            }
            else
            {
                writer.RenderBeginTag(ElementName);
                writer.RenderEndTag();
            }
        }

What I would like is for the rendering to be modified based on UseXfbmlSemantics - if it's true, it should render, for instance:

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

When it's false, it should render with a self-closing tag:

<fb:name uid="10300399458" />

I can get the "true" condition to work almost correctly, but the self-closing tag seems to be incompatible with the Render- set of methods. Unfortunately if that's the case it also means that the AddAttributesToRender pattern wouldn't work, either. What it's actually producing is this:


        <fb:name uid="10300399458">

        </fb:name>

How can I get HtmlTextWriter (or which HtmlTextWriter do I need to use) to make it render a self-closing tag? Or, at the very least, how can I make it not render that interim space (so that the opening and closing tags are immediately next to one another)?

like image 655
Rob Avatar asked Dec 04 '22 16:12

Rob


2 Answers

Since this is the top SO question that comes up when searching for "HtmlTextWriter self closing tag", this is for anyone coming here that wants to know how to do it:

writer.WriteBeginTag("tag");
writer.WriteAttribute("attribute", "attribute value");
// ... add other attributes here ...
writer.Write(HtmlTextWriter.SelfClosingTagEnd);
like image 116
Tony Avatar answered Mar 09 '23 01:03

Tony


This should get you going - it will render as <fb:name uid="00101010101"/>. You could also override the RenderBeginTag, RenderContents, RenderEndTag. Depending on what you are doing there may be some other things going on in RenderControl that you need. You could also look into using a ControlAdapter, this may give you better separation of control functionality VS control html writing.

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

like image 33
Jason Hernandez Avatar answered Mar 08 '23 23:03

Jason Hernandez