_Layout中强类型局部视图的异步操作

时间:2012-10-24 20:29:33

标签: asp.net .net asp.net-mvc-4 partial-views async-await

所以,这是破旧......

我的MVC 4应用程序的主布局页面有一些动态信息,需要强力键入特定的域实体才能获取该信息。为了使我的文件更清晰,我已将输入的字段提取到局部视图。

要获取我需要的实体并将其映射到partial的视图模型,我有一个LayoutController,其动作返回Task<PartialViewResult>。此操作使用服务层对{API}项目进行async调用,await实体。它将该实体按摩到视图模型中,然后返回PartialView("_LayoutPartial", viewModel).

在_Layout页面内,通过以下方式调用partial:

@{Html.RenderAction("LayoutInfo", "Layout", new { /*entity primary key*/ });}

我已经完成了代码,它确实得到了正确的实体,但是在返回部分视图任务之后,我得到了每个人最喜欢的服务器错误页面,并出现以下错误:

HttpServerUtility.Execute blocked while waiting for an asynchronous operation to complete.

我做了一些谷歌搜索和搜索,并不知道这实际意味着什么。我是否正确地思考了这个问题?

1 个答案:

答案 0 :(得分:2)

该错误消息意味着您正在尝试从同步方法中调用(并等待!)异步方法。在您的特定情况下,同步方法是HtmlHelper.RenderAction,异步方法是您的任务返回操作方法。发生错误的原因是编写异步任务返回方法的点可能是为了避免阻塞线程,但RenderAction在Task完成之前无法返回,因此RenderAction在等待操作完成时结束阻塞。

一个选项是使RenderAction调用同步而不是异步的方法,请记住这将继续阻止原始线程。另一种选择是从原始操作方法中异步填充布局数据,然后通过ViewData将其传递到布局页面。