HtmlHelper使用ViewContext.Writer无法正确呈现

时间:2010-08-30 11:34:23

标签: asp.net asp.net-mvc asp.net-mvc-2 html-helper

我正在使用asp.net MVC构建一个简单的CMS,我几乎所有部分都在工作。我有一个小问题,我无法解决如何解决。我有一个Html辅助方法,用于呈现区域的内容。但是,此方法使用Response.Write来写入其内容而不是返回字符串。原因是我正在执行部分请求,因此没有要返回的字符串。

我的模板正文如下:

<body>
    <h1>Default Template</h1>
    <% Html.ContentArea("Main"); %>
</body>

我遇到的问题是内容呈现在H1标签之上。我的理解是h1应该已经在响应中,因此我对response.Write()的调用会在该点之后附加内容。这显然没有发生。我在这里错过了什么。

之前我使用过partial requests,他们总是在正确的位置渲染。我还没有将它们与MVC 2一起使用,这可能就是问题所在。

以下是内容区域扩展方法。窗口小部件呈现方法各不相同,也是部分请求发生的位置。然而,即使开始和结束容器标签渲染在h1之上,所以它必须是基本的我做错了。

    public static void ContentArea(this HtmlHelper htmlHelper, string areaName)
    {
        var container = new TagBuilder("div");
        container.GenerateId(areaName);
        container.AddCssClass("content-area");

        var response = htmlHelper.ViewContext.HttpContext.Response;

        response.Write(container.ToString(TagRenderMode.StartTag));

        var pageWidgets = htmlHelper.ViewData[areaName] as IList<PageWidget>;
        if (pageWidgets != null)
            foreach (var widget in pageWidgets)
            {
                widget.GetInstance().Render(new WidgetContext(htmlHelper.ViewContext, widget));
            }

        response.Write(container.ToString(TagRenderMode.EndTag));
    }

这可能很简单......不总是这样:)

修改

即使以下内容无法正确显示以前的评论使用ViewContext.Writer而没有任何区别。

    public static void ContentArea(this HtmlHelper htmlHelper, string areaName)
    {
        var container = new TagBuilder("div");
        container.GenerateId(areaName);
        container.AddCssClass("content-area");

        var writer = htmlHelper.ViewContext.Writer;

        writer.Write(container.ToString(TagRenderMode.StartTag));

        writer.Write(container.ToString(TagRenderMode.EndTag));
    }

这呈现为

<div id="Main" class="content-area"></div>
<h1>Default Template</h1>

谢谢,

伊恩

2 个答案:

答案 0 :(得分:1)

您是否尝试过使用ViewContext.Writer.Write而不是Response.Write?我认为这是我在扩展方法中使用的,我没有任何问题。

答案 1 :(得分:0)

为挖掘一年之久的问题道歉,但我已经实现了OP的代码,我无法在ASP.NET MVC 2上重现这个问题。

在我的视图中有这个...

<body>
    <h1>Default Template</h1>
    <% Html.ContentArea2("Main"); %>
</body>  

...我得到了这个输出:

<body>
    <h1>Default Template</h1>
    <div class="content-area" id="Main"></div>
</body>