gpt4 book ai didi

asp.net-mvc - 使用自定义 HTML 扩展在 ASP.NET MVC 3 Razor View 引擎中呈现损坏

转载 作者:行者123 更新时间:2023-12-04 22:25:10 24 4
gpt4 key购买 nike

我刚刚安装了 ASP.NET MVC 3 RC 来尝试升级 MVC 2 站点。我遇到了一个渲染问题,我使用从头开始创建的 MVC 3 项目设法在站点外重现了该问题。

这是我的 Razor cshtml View :

@using Mvc3RCTest.Helpers

<h2>Demo Render Bug</h2>

<div class="content">
@{ Html.RenderTest(); }
</div>

RenderTest 是一个 HTML 扩展,定义如下:
using System.Web;
using System.Web.Mvc;

namespace Mvc3RCTest.Helpers
{
public static class TestHtmlExtensions
{
public static void RenderTest(this HtmlHelper html)
{
HttpResponseBase r = html.ViewContext.HttpContext.Response;
r.Write("<ul>");
for (int i = 0; i < 10; ++i)
{
r.Write("<li>" + i + "</li>");
}
r.Write("</ul>");
}
}
}

呈现时,HTML 如下所示:
<ul><li>0</li><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li></ul>
<h2>Demo Render Bug</h2>

<div class="content">
</div>

如您所见,RenderTest HTML 扩展的输出在 Razor 模板的其余部分之前错误地发出。似乎 Razor 渲染引擎试图缓存整个输出,而没有意识到 HTML 扩展可以直接写入输出。

有没有其他人看到过这个问题?任何人都知道如何解决这个问题,而不必重做我的所有 HTML 扩展而不直接写入输出?

最佳答案

不幸的是,您的所有助手都应该写入 ViewContext.Writer ,就像这样

public static void RenderTest(this HtmlHelper html)
{
var writer = html.ViewContext.Writer;
writer.Write("<ul>");
for (int i = 0; i < 10; ++i)
{
writer.Write("<li>" + i + "</li>");
}
writer.Write("</ul>");
}

在 aspx View 引擎中,事情可能对您有用,但这纯属巧合。并不是说 Razor 本身在缓存任何东西。由于 Razor 页面的由内而外呈现,它会将内容写入临时缓冲区,而这些内容仅在您到达最顶部的布局页面时才会在适当的时间写入响应流。如果您直接写入响应流,那么您将乱序写入内容。

关于asp.net-mvc - 使用自定义 HTML 扩展在 ASP.NET MVC 3 Razor View 引擎中呈现损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4176133/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com