3

我正在迁移一些HtmlTextWriter广泛用于呈现 UI 元素的旧代码。

我正在迁移代码以使用 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 视图中获取实例,但显然即使是 HtmlHelper 也不使用它。我想念什么吗?

  2. 每次调用GenerateHtml都会生成小的 HTML 片段,一般不超过 1000 个字符,但调用次数可能很多。是否值得将HtmlTextWriter依赖代码重写为 StringBuilder?或者相反,如何创建一个HtmlTextWriter将在所有调用中使用的实例(并在迭代结束时刷新)。

4

2 回答 2

5

我认为使用 helper.ViewContext.writer 可以代替创建 StringBuider 和 StringWriter 。

那么上面的示例代码将是:

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> 列表。它工作得很好。还没有尝试过渲染控件。

于 2010-10-29T17:18:53.767 回答
0

我在这里有一个演示应用程序,它展示了如何在 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,如果它没有坏...

于 2010-08-04T18:33:00.320 回答