如何异步呈现局部视图

时间:2015-11-25 10:19:24

标签: c# asp.net asp.net-mvc asp.net-mvc-4 razor

可以异步渲染部分视图吗?

我有部分视图需要呈现博客帖子。博客帖子是异步返回的。

在我的_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'

我是否应该只创建一个同步方法来恢复我的数据?

2 个答案:

答案 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

我将所有方法都改为同步。