Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 使用自定义HTML扩展在ASP.NET MVC 3 Razor视图引擎中呈现损坏_Asp.net Mvc_Razor - Fatal编程技术网

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

Asp.net mvc 使用自定义HTML扩展在ASP.NET MVC 3 Razor视图引擎中呈现损坏,asp.net-mvc,razor,Asp.net Mvc,Razor,我刚刚安装了ASP.NETMVC3RC来尝试升级一个MVC2站点。我遇到了一个渲染问题,我使用一个从头创建的MVC 3项目在站点外部重新编程 以下是我的Razor cshtml视图: @using Mvc3RCTest.Helpers <h2>Demo Render Bug</h2> <div class="content"> @{ Html.RenderTest(); } </div> @使用Mvc3RCTest.Helpers 演示渲染错

我刚刚安装了ASP.NETMVC3RC来尝试升级一个MVC2站点。我遇到了一个渲染问题,我使用一个从头创建的MVC 3项目在站点外部重新编程

以下是我的Razor cshtml视图:

@using Mvc3RCTest.Helpers

<h2>Demo Render Bug</h2>

<div class="content">
@{ Html.RenderTest(); }
</div>
@使用Mvc3RCTest.Helpers
演示渲染错误
@{Html.RenderTest();}
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>");
        }
    }
}
使用System.Web;
使用System.Web.Mvc;
命名空间Mvc3RCTest.Helpers
{
公共静态类TestHtmlExtrade
{
公共静态void RenderTest(此HtmlHelper html)
{
HttpResponseBase r=html.ViewContext.HttpContext.Response;
r、 写(“
    ”); 对于(int i=0;i<10;++i) { r、 写(“
  • ”+i+”
  • ”; } r、 写“
”; } } }
呈现时,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>
  • 0
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
演示渲染错误
如您所见,RenderTest HTML扩展的输出在Razor模板的其余部分之前错误地发出。似乎Razor渲染引擎正在尝试缓存整个输出,而没有意识到HTML扩展可以直接写入输出


还有谁见过这个问题吗?有人知道如何解决这个问题,而不必重做所有HTML扩展就可以不直接写入输出?

HTML帮助程序通常会返回一个而不是直接写入响应。直接写入响应让我想起了古老的经典WebForms控件:-)

publicstaticmvchtmlstring RenderTest(此HTMLHelperHTML)
{
var ul=新标记生成器(“ul”);
var sb=新的StringBuilder();
对于(int i=0;i<10;++i)
{
var li=新标记生成器(“li”);
li.SetInnerText(i.ToString());
某人附加(li.ToString());
}
ul.InnerHtml=sb.ToString();
返回MvcHtmlString.Create(ul.ToString());
}

作为旁注,
TagBuilder
类已移动到MVC 3 RC中的
System.Web.WebPages
程序集中,因此请确保引用了该程序集。

不幸的是,您的所有助手都应该向
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>");
}
publicstaticvoidrendertest(此HTMLHelperHTML)
{
var writer=html.ViewContext.writer;
writer.Write(“
    ”); 对于(int i=0;i<10;++i) { writer.Write(“
  • ”+i+“
  • ”); } writer.Write(“
”); }

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

谢谢,您挽救了这一天。因为这个原因,我正要中止升级到MVC 3!实际上我希望Razor引擎不会缓存我所有的写调用。。。写操作与返回字符串的全部目的是为了更高效地处理大量数据。在呈现大量数据(例如,大型表或列表)时,最好将写操作写入输出流。它通过减少每个请求的内存占用来提高可伸缩性。它还减少了客户端的响应时间,因为在所有渲染缓存到字符串中之前,客户端可以更快地开始接收数据,而不是阻塞数据。
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>");
}