WriteBeginTag的奇怪问题

时间:2010-03-31 07:52:43

标签: .net asp.net html render

我使用此类代码,但呈现错误<li class="dd0"><div id="dt1"<a href="http://localhost:1675/Category/29-books.aspx">Books</a></div></li>

开始标记div中没有​​>。有什么问题?

writer.WriteBeginTag("li");
                //writer.WriteAttribute("class", this.CssClass);
                writer.WriteAttribute("class", "dd0");
                if (!String.IsNullOrEmpty(this.LiLeftMargin))
                {
                    writer.WriteAttribute("style", string.Format("margin-left: {0}px", this.LiLeftMargin));
                }
                writer.Write(HtmlTextWriter.TagRightChar);
                writer.WriteBeginTag("div");
                writer.WriteAttribute("id", "dt1");
                this.HyperLink.RenderControl(writer);
                writer.WriteEndTag("div");
                writer.WriteEndTag("li");

3 个答案:

答案 0 :(得分:8)

您需要在编写属性后添加对writer.Write(HtmlTextWriter.TagRightChar)的调用(就像您已经为li元素所做的那样):

writer.WriteBeginTag("div");
writer.WriteAttribute("id", "dt1");
writer.Write(HtmlTextWriter.TagRightChar);

WriteBeginTag {{1}}明确说明了这种行为:

  

WriteBeginTag方法不会写入标记元素的开始标记的结束尖括号(&gt;)。这允许将标记属性写入元素的开始标记。在调用WriteBeginTag方法时,使用TagRightChar常量来关闭开始标记。

答案 1 :(得分:1)

您不需要使用 writer.Write(HtmlTextWriter.TagRightChar); ,编写器足够聪明以关闭标记。再次使用 Write RenderEndTag时,您不需要提供参数。

编辑。我在这里谈论不同的方法。这是我将使用的代码:

    output.AddAttribute("class", "dd0");

    if (!String.IsNullOrEmpty(this.LiLeftMargin))
    {
        output.AddAttribute("style", string.Format("margin-left: {0}px", LiLeftMargin));
    }

    output.RenderBeginTag("li");

    //output.Write(HtmlTextoutput.TagRightChar);
    output.AddAttribute("id", "dt1");
    output.RenderBeginTag("div");

    this.HyperLink.RenderControl(output);

    output.RenderEndTag(); //div
    output.RenderEndTag(); //li

答案 2 :(得分:1)

或者,您可以这样做:

output.AddAttribute(HtmlTextWriterAttribute.Id, "dt1");
output.RenderBeginTag(HtmlTextWriterTag.Div);
output.RenderEndTag();

这将创建您想要的结果。将AddAttribute放在RenderbeginTag之前或属性不会出现是很重要的!

我认为这种方法很简洁。