繁体   English   中英

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

[英]HtmlHelper using ViewContext.Writer not rendering correctly

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

我的模板主体如下所示:

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

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

我以前使用过部分请求 ,它们总是在正确的位置呈现。 我尚未将它们与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>

谢谢,

伊恩

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

道歉,以解决一个已有很长时间的问题,但是我已经实现了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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM