Какой метод вы считаете более читабельным для вывода динамического HTML? - PullRequest
0 голосов
/ 26 февраля 2009

Я представляю, что это сводится к личным предпочтениям, но каким путем вы пойдете?

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 ]

3 голосов
/ 26 февраля 2009

Еще один голос за "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
          );
    }
}

Это дает преимущество, заключающееся в том, что с течением времени его легко использовать повторно и добавлять в концепцию функции. Чтобы получить реальную фантазию, вы можете превратить этот класс в пользовательский контроль.

3 голосов
/ 26 февраля 2009

Мне лично я бы выбрал первый вариант. Просто чтобы отметить также, быстрый совет по сохранению кода здесь. Вы можете использовать AppendFormat для StringBuilder.

РЕДАКТИРОВАТЬ: подход HtmlTextWriter даст вам гораздо более структурированный результат, и если объем HTML для генерации вырос, то это был бы очевидный выбор. ИЛИ использование файла HTML и использование его в качестве шаблона и, возможно, замены строк

ASP.NET User Control - еще один хороший выбор для шаблонов.

2 голосов
/ 26 февраля 2009

Я бы предпочел:

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.

1 голос
/ 26 февраля 2009

Я создал несколько вспомогательных классов для создания 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-кодирование значений, и нет проблем с выходом строки.

1 голос
/ 26 февраля 2009

Я бы предпочел сделать это в aspx, используя элемент управления ListView, который специально создан для этой цели. Таким образом, ваш код останется читаемым и отделенным (без HTML в C # Code). При вашем подходе вы не получите предупреждений о проверке XHTML времени компиляции.

...