2012-10-24 97 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

相關問題