Использование HtmlTextWriter в ASP.NET MVC

Я перенес старый код, где HtmlTextWriter широко используется для визуализации элементов пользовательского интерфейса.

Я перемещаю код для использования ASP.NET MVC 1.0. Насколько я знаю, я не использую HtmlTextWriter конкретная функция (например, отступ).

В настоящее время я использую метод-оболочку для возврата строки, сгенерированной HtmlTextWriter следующим образом:

var sw = new StringWriter();
var xhtmlTextWriter = new XhtmlTextWriter(sw);
GenerateHtml(xhtmlTextWriter);
return sw.ToString();

Мои вопросы:

  1. Я пытаюсь получить HtmlTextWriter экземпляр из ASP.NET MVC View, но, видимо, даже HtmlHelper не использует это. Я что-то пропустил?

  2. Каждый звонок GenerateHtml генерирует небольшие фрагменты HTML, обычно не более 1000 символов, но может быть много вызовов. Стоит ли переписывать HtmlTextWriter зависимый код в StringBuilder? Или вместо этого, как насчет создания HtmlTextWriter экземпляр, который будет использоваться во всех вызовах (и сбрасывается в конце итераций).

2 ответа

Вместо создания StringBuider и StringWriter, я думаю, что будет работать helper.ViewContext.writer.

Тогда приведенный выше пример кода будет:

var calendar = new DayPilotCalendar();
if( model != null )
   {
   model.CopyTo( calendar );
   }
if( options != null )
   {
   options.CopyTo( calendar );
   }

HtmlTextWriter writer = new HtmlTextWriter( helper.ViewContext.Writer );

writer.AddAttribute( HtmlTextWriterAttribute.Class, "dayPilot" );
writer.RenderBeginTag( HtmlTextWriterTag.Div );
calendar.RenderControl( writer );
writer.RenderEndTag();  // Close DIV

return( null );         // Don't need to return anything.

Отказ от ответственности: До сих пор я только пытался использовать helper.ViewContext.Writer для создания списка

    . Работало нормально. Не пробовал это сделать элементы управления.

У меня есть демонстрационное приложение, которое показывает, как это сделать в приложении MVC.

Вот пример кода из этого поста.

    public static string DayPilot(
        this HtmlHelper helper,
        DayPilotData model,
        DayPilotViewOptions options)
    {
        var calendar = new DayPilotCalendar();
        if (model != null)
        {
            model.CopyTo(calendar);
        }
        if (options != null)
        {
            options.CopyTo(calendar);
        }
        var sb = new System.Text.StringBuilder();
        sb.Append("<div class=\"dayPilot\">"); // allows working around td cellpadding bug in css
        using (var sw = new System.IO.StringWriter(sb))
        {
            using (var tw = new HtmlTextWriter(sw))
            {
                calendar.RenderControl(tw);
            }
        }
        sb.Append("</div>");
        return sb.ToString();
    }

Что касается № 2, если он не сломался...

Другие вопросы по тегам