2010-08-04 2 views
3

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

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

ответ

0

У меня есть a demo app здесь, где показано, как это сделать в приложении 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, если он не сломался ...

+0

... не исправить. Да, но моя главная проблема заключается в том, что код предполагает, что HtmlTextWriter поддерживается потоком, а не StringWriter/StringBuilder. Наличие другого бэкэнд может серьезно повлиять на производительность и может быть воспринято конечным пользователем как «сломанное». –

+1

Если профилирование доказывает, что это на самом деле узкое место, тогда обязательно исправьте это. –

4

Вместо создания 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 для получения <UL> список. Он работал нормально. Не пробовал, чтобы визуализировать элементы управления.

+0

К сожалению, свойство ViewContext.Writer доступно только для ASP.NET MVC 2.0. Спасибо за информацию, хотя. –

Смежные вопросы