可以异步渲染部分视图吗?
我有部分视图需要呈现博客帖子。博客帖子是异步返回的。
在我的_Layout
文件中,我呈现了我的部分页脚_Footer
。在_Footer
中,我有以下标记:
@Html.Action("FooterLatestBlogPosts", "Common")
所以在我的Common
控制器中,我有以下操作方法:
public async Task<ActionResult> FooterLatestBlogPosts()
{
List<ArticleDTO> articleDTOs = await articleTask.GetAllAsync();
return PartialView(articleDTOs);
}
在我的FooterLatestBlogPosts
部分视图中,我有以下内容:
@model List<MyProject.Application.DTO.ArticleDTO>
@if (Model.Count > 0)
{
<ul class="list-unstyled">
@foreach (var articleDTO in Model)
{
<li>@articleDTO.Title</li>
}
</ul>
}
我收到了一个错误:
Error executing child request for handler 'System.Web.Mvc.HttpHandlerUtil+ServerExecuteHttpHandlerAsyncWrapper'
我是否应该只创建一个同步方法来恢复我的数据?
答案 0 :(得分:31)
首先,您需要按照@buffjape的建议使用Html.Partial
。如果您的部分视图不在Shared
文件夹中,则需要指定视图的路径
@Html.Partial("~/Views/Common/FooterLatestBlogPosts", yourModel)
但是在这种情况下,您的视图仍然是同步加载的。要以异步方式加载它,您需要通过jQuery加载它。文章Improve perceived performance of ASP.NET MVC websites with asynchronous partial views给出了如何实现它的非常好的描述。
同时将您的Html.Render
替换为
$(document).ready(function(){
$("#yourContainer").load('@Url.Action("FooterLatestBlogPosts", "Common")')
});
答案 1 :(得分:8)
我在@buffjape建议的帖子中回答了问题:
Async PartialView causes "HttpServerUtility.Execute blocked..." exception
我将所有方法都改为同步。