0

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

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();

比。

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 不可用

4

5 回答 5

3

就我个人而言,我会选择第一个选项。还要指出,这里有一个快速的代码保存技巧。您可以将AppendFormat用于 StringBuilder。

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

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

于 2009-02-26T15:43:14.483 回答
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
          );
    }
}

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

于 2009-02-26T15:46:44.303 回答
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,它也能更容易阅读。

于 2009-02-26T15:46:08.720 回答
1

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

于 2009-02-26T15:48:54.703 回答
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 编码的控件,并且不存在字符串转义问题。

于 2009-02-26T16:00:47.233 回答