2012-10-24 27 views
2

所以,这里的破败......在_layout强类型的局部视图

我有一个总体布局页为我的MVC应用程序4异步操作,有一些动态信息,需要强类型来一个特定的域实体来获取这些信息。为了保持我的文件更清洁,我已经将类型字段提取为部分视图。

要获取我需要的实体并将其映射到部分的视图模型,我有一个LayoutController,其中的操作返回Task<PartialViewResult>。此操作使用服务层向调用实体的Web API项目发出呼叫。它按摩是实体到视图模型,然后返回PartialView("_LayoutPartial", viewModel).

从_layout页面中,部分是通过所谓:

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

我已经通过代码加强,它确实得到正确的实体回来,但后恢复局部视图任务后,我得到大家的喜爱服务器错误页面,出现以下错误:

我做了一些谷歌搜索,并因此搜索的我不知道这实际上是什么意思。我是否正确地思考?

回答

2

该错误消息意味着您正试图从同步方法内调用(并等待!)异步方法。在你的具体情况下,同步方法是HtmlHelper.RenderAction,异步方法是你的任务返回操作方法。发生错误的原因是编写异步任务返回方法的目的大概是为了避免阻塞线程,但是在任务完成之前RenderAction不能返回,所以RenderAction在等待操作完成时结束阻塞。

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

+0

感谢您的建议和解释!我确实通过使动作同步然后使用_service.GetEntity(...)。Result来尝试你的第一个建议,但它会永远挂起,这完全是另一个问题,我不知道该如何处理。我会尝试你的其他选择,看看我能否得到这个工作。如果我能解释好的话,我会给你+1! – mshubert12

+0

嗯,我试过,并得到类似的问题... Task.Wait()只是永远挂起,页面根本不加载,Task.ContinueWith()跳过ViewBag被填充前返回视图,所以然后有一个空引用异常。有趣的事情,虽然......在第二种情况下,在空引用异常命中后,ContinueWith中的断点终于被命中,并且来自Task的正确响应。这很奇怪。 – mshubert12

相关问题