2011-11-26 35 views
2

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

任何人都可以为我提供解决方法吗?如果不这样做,是否还有另一种好的方法来呈现视图中另一个动作的内容,而不需要知道该动作?

+0

只是出于兴趣,你使用Html.RenderPartial?如果是这样,我会尝试使用Html.Partial,因为RenderPartial将直接写入响应,并且Partial将返回一个MvcHtmlString,如果您有多个循环正在进行,则可能会以不同的方式处理该MvcHtmlString。 – SGB

+0

在这个例子中,我使用博客文章中说明的html助手,该助手在PartialRequest对象上调用Invoke(部分视图然后直接写入,因此不会返回任何内容)。我遇到的问题是我调用的操作附带了一个AuthorizeAttribute,以防止某些用户登录时完全显示它,这就是为什么我不能使用Partial或RenderPartial – NickL

回答

1

是的,这是可能的。

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

我过去使用的解决方法是临时将任何写入的响应重定向到MemoryStream,同时尝试呈现其他操作,然后从MemoryStream的内容创建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(); 
} 
+0

感谢您的回复。我认为不可能直接写入/读取输出流,所以您如何设法替换它? – NickL

相关问题