【问题标题】:Can Steven Sanderson's Partial Request technique be used in Razor pages?可以在 Razor 页面中使用 Steven Sanderson 的部分请求技术吗?
【发布时间】:2011-11-26 17:41:34
【问题描述】:

我喜欢 http://blog.stevensanderson.com/2008/10/14/partial-requests-in-aspnet-mvc/ 中 Steven Sanderson 的部分请求的想法,并且我正试图让它与 Razor 页面一起使用。不幸的是,它将它写入页面顶部,而不是我真正希望它在文档中的位置。我猜这个问题类似于这里回答的问题:ASP.Net MVC 3 Razor Response.Write position 但我不知道如何解决它。

谁能给我一个解决方法?如果做不到这一点,是否有另一种好的技术可以在视图中呈现另一个动作的内容,而该视图不必知道该动作?

【问题讨论】:

  • 只是出于兴趣,您使用 Html.RenderPartial 吗?如果是这样,我会尝试使用 Html.Partial 代替,因为 RenderPartial 将直接写入响应,并且 Partial 将返回一个 MvcHtmlString 如果您有多个循环,则可能会以不同的方式处理。
  • 在这种情况下,我使用了博客文章中说明的 html 帮助程序,它在 PartialRequest 对象上调用 Invoke(然后直接编写部分视图,因此不返回任何内容)。我遇到的问题是我正在调用的操作附加了一个 AuthorizeAttribute 以防止在某些用户登录时完全显示它,这就是为什么我不能使用 Partial 或 RenderPartial

标签: asp.net-mvc razor request asp.net-mvc-partialview


【解决方案1】:

是的,这是可能的。

我确信您现在知道 Razor 视图引擎会在写入响应流之前写入临时缓冲区,这就是为什么当您调用另一个操作时,标记会乱序写入响应。

我过去使用的解决方法是在您尝试呈现另一个操作时将任何写入临时重定向到MemoryStream 的响应,然后从@987654323 的内容创建MvcHtmlString @。

比如:

public class HttpResonseCapture : IDisposable
    {
        private readonly MemoryStream _stream = new MemoryStream();
        private readonly Stream _originalStream;
        private readonly HttpContextBase _httpContext;

        public HttpResponseCapture(HttpContextBase httpContext)
        {
            _httpContext = httpContext;
            _originalStream = httpContext.Response.OutputStream;
            httpContext.Response.OutputStream = _stream;
        }

        public MvcHtmlString ToHtmlString() 
        {
            return MvcHtmlString.Create(Encoding.Unicode.GetString(_stream.ToArray()));
        }

        public void Dispose()
        {
            _httpContext.Response.OutputStream = _originalStream;
            _stream.Dispose();
        }
    }

可以这样使用:

using (var responseCapture = new HttpResponseCapture(httpContext))
{
   // Call other action here
   var result = responseCapture.ToHtmlString();
}

【讨论】:

  • 感谢您的回复。我认为直接写入/读取输出流是不可能的,那么您如何设法替换它?
猜你喜欢
  • 2019-04-07
  • 1970-01-01
  • 2018-12-20
  • 2021-06-28
  • 1970-01-01
  • 2020-08-05
  • 2021-09-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多