加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – 使用自定义HTML扩展在ASP.NET MVC 3 Razor View

发布时间:2020-12-16 07:31:25 所属栏目:asp.Net 来源:网络整理
导读:我刚刚安装了ASP.NET MVC 3 RC来尝试升级MVC 2站点.我遇到了一个渲染问题,我设法在网站之外重新编写,使用从头创建的MVC 3项目. 这是我的Razor cshtml视图: @using Mvc3RCTest.Helpersh2Demo Render Bug/h2div class="content"@{ Html.RenderTest(); }/div R
我刚刚安装了ASP.NET MVC 3 RC来尝试升级MVC 2站点.我遇到了一个渲染问题,我设法在网站之外重新编写,使用从头创建的MVC 3项目.

这是我的Razor cshtml视图:

@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视图引擎中,事情可能对你有用,但这纯属巧合.这并不是说Razor本身就是在缓存任何东西.由于Razor页面由内而外呈现,它会将内容写入临时缓冲区,而临时缓冲区只有在您到达最顶层布局页面时才会在适当的时间写入响应流.如果您直接写入响应流,那么您将不按顺序编写内容.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读