您发现哪种方法可以输出动态HTML?

时间:2009-02-26 15:41:05

标签: c# readability html-generation

我想这会归结为个人喜好,但你会走哪条路?

StringBuilder markup = new StringBuilder();

foreach (SearchResult image in Search.GetImages(componentId))
{
    markup.Append(String.Format("<div class=\"captionedImage\"><img src=\"{0}\" width=\"150\" alt=\"{1}\"/><p>{1}</p></div>", image.Resolutions[0].Uri, image.Caption));
}

LiteralMarkup.Text = markup.ToString();

Vs以上。

StringBuilder markup = new StringBuilder();

foreach (SearchResult image in Search.GetImages(componentId))
{
    markup.Append(String.Format(@"<div class=""captionedImage""><img src=""{0}"" width=""150"" alt=""{1}""/><p>{1}</p></div>", image.Resolutions[0].Uri, image.Caption));
}

LiteralMarkup.Text = markup.ToString();

或者我根本不应该这样做而是使用HtmlTextWriter类?

编辑:这里有一些非常好的建议。我们在2.0框架上,因此LINQ不可用

5 个答案:

答案 0 :(得分:3)

我个人认为我会选择第一个选项。还要指出的是,这里有一个快速的代码保存提示。你可以使用 AppendFormat 作为StringBuilder。

编辑:HtmlTextWriter方法会为您提供更加结构化的结果,如果生成的HTML数量增加,那么这将是一个明显的选择。或者使用HTML文件并将其用作模板并使用字符串替换

ASP.NET用户控件是模板的另一个不错的选择。

答案 1 :(得分:3)

对“AppendFormat”的另一次投票。此外,为了服务器代码,我可能会在这里提出单引号,以避免任何转义:

StringBuilder markup = new StringBuilder();

foreach (SearchResult image in Search.GetImages(componentId))
{
    markup.AppendFormat(
        "<div class='captionedImage'><img src='{0}' width='150' alt='{1}'/><p>{1}</p></div>", 
        image.Resolutions[0].Uri, image.Caption
      );
}

LiteralMarkup.Text = markup.ToString();

最后,您可能还需要在某处进行额外检查,以防止html / xss注入。

另一种选择是将您的图像封装在一个类中:

public class CaptionedHtmlImage
{  
    public Uri src {get; set;};
    public string Caption {get; set;}

    CaptionedHtmlImage(Uri src, string Caption)
    {
        this.src = src;
        this.Caption = Caption;
    }

    public override string ToString()
    {
        return String.Format(
            "<div class='captionedImage'><img src='{0}' width='150' alt='{1}'/><p>{1}</p></div>"
            src.ToString(), Caption
          );
    }
}

这样做的好处是可以轻松地重复使用并随着时间的推移为概念添加功能。为了获得真正的想象力,您可以将该类转换为用户控件。

答案 2 :(得分:2)

我更喜欢:

StringBuilder markup = new StringBuilder();
string template = "<div class=\"captionedImage\"><img src=\"{0}\" width=\"150\" alt=\"{1}\"/><p>{1}</p></div>";

foreach (SearchResult image in Search.GetImages(componentId))
{
   markup.AppendFormat(template,image.Resolutions[0].Uri, image.Caption);
}

LiteralMarkup.Text = markup.ToString();

如另一个答案所述,使用AppendFormat()。

看一下SharpTemplate的html模板,即使是少量的HTML,也可以轻松阅读。

答案 3 :(得分:1)

我更喜欢使用ListView控件在aspx中执行此操作,而ListView控件正是为此目的而制作的。因此,您的代码将保持可读性并且是分开的(C#代码中没有HTML)。使用您的方法,您将无法获得编译时的XHTML验证警告。

答案 4 :(得分:1)

我已经创建了一些辅助类来创建html控件,所以我的代码看起来像这样:

foreach (SearchResult image in Search.GetImages(componentId)) {
  ContainerMarkup.Controls.Add(
    Tag.Div.CssClass("captionedImage")
    .AddChild(Tag.Image(image.Resolutions[0].Uri).Width(150).Alt(Image.Caption))
    .AddChild(Tag.Paragraph.Text(Image.Caption)));
}

起初它可能看起来不简单,但它很容易使用,创建控件,对值进行正确的html编码,并且没有字符串转义问题。