服务器控制行为奇怪

时间:2011-09-23 09:37:17

标签: asp.net custom-server-controls

我有一个我写的服务器控件,通常可以正常工作。但是,当我添加突出显示的行时,它会添加一个而不是两个<br />元素,这不是我所追求的。

mounting=new DropDownLabel();
mounting.ID="mountTypeList";
mounting.Attributes.Add("class", "mounting");
mounting.Values=Configuration.MountTypes.GetConfiguration().Options;
mounting.Enabled=Utilities.UserType == UserType.Admin;
mounting.Value=value.Reference;
td1.Controls.Add(mounting);
**td1.Controls.Add(new HtmlGenericControl("br"));**
var span=new HtmlGenericControl("span");
span.Attributes.Add("class", "mountDescription");
span.ID="mountDescription";
td1.Controls.Add(span);

对我做错了什么的想法?

ETA:

我已经通过使用jquery添加br解决了这种情况,无论如何我都在那里使用它。但我看到的行为肯定是错的。如果我添加一个元素,它应该添加该元素,而不是该元素的两倍。

1 个答案:

答案 0 :(得分:4)

HtmlGenericControl会生成包含开始和结束标记的<br></br>

相反,你可以使用new LiteralControl("<br/>")来做你想做的事。

修改

要解决此问题,您需要自己实施HtmlGenericControl,并针对没有关联开关标签的情况进行扩展。

public class HtmlGenericSelfClosing : HtmlGenericControl
{
    public HtmlGenericSelfClosing()
        : base()
    {
    }

    public HtmlGenericSelfClosing(string tag)
        : base(tag)
    {
    }

    protected override void Render(HtmlTextWriter writer)
    {
        writer.Write(HtmlTextWriter.TagLeftChar + this.TagName);
        Attributes.Render(writer);
        writer.Write(HtmlTextWriter.SelfClosingTagEnd);
    }

    public override ControlCollection Controls
    {
        get { throw new Exception("Self-closing tag cannot have child controls"); }
    }

    public override string InnerHtml
    {
        get { return String.Empty; }
        set { throw new Exception("Self-closing tag cannot have inner content"); }
    }

    public override string InnerText
    {
        get { return String.Empty; }
        set { throw new Exception("Self-closing tag cannot have inner content"); }
    }
}

Found Here