Использование 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();
Мои вопросы:
Я пытаюсь получить
HtmlTextWriter
экземпляр из ASP.NET MVC View, но, видимо, даже HtmlHelper не использует это. Я что-то пропустил?Каждый звонок
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, если он не сломался...