2014-10-09 35 views
0

我使用異步/等待,並從我的視圖之一調用異步方法,我需要等到它完成。 I've seen a lot of examples for ASP.NET MVC, where you can just put an "async" into the signature of your action.但我還沒有看到ASP.NET WebPages的任何示例。在ASP.NET WebPages中等待任務剃刀視圖

我是否在Razor視圖中返回的任務上調用「Wait()」?我看到了針對Wait()的建議。

請給我一些關於如何在WebPages的Razor視圖中正確調用異步方法的參考資料/示例。

+0

'async/await'是一個核心功能,不綁定到MVC。此外,'async'不會使方法異步,它允許您在已經異步的方法上「等待」。只需將正確的關鍵字添加到您的方法中,就如同使用MVC – 2014-10-09 16:34:39

+0

我的方法中包含所有正確的關鍵字。我只需要知道如何從我的意見中正確地打電話給他們? – 2014-10-09 16:38:17

+0

[使用等待在剃刀視圖]可能的重複(http://stackoverflow.com/questions/19182349/use-of-await-in-razor-views) – 2014-10-10 07:13:17

回答

5

呼籲從我的觀點

一個異步方法,不要從視圖內調用的方法。該視圖實際上應該只是綁定到模型上的數據。如果要執行異步操作來獲取模型的數據,請在填充模型時在控制器中執行該操作。

作爲一個人爲的例子:

public class MyViewModel 
{ 
    public string SomeValue { get; set; } 
} 

和在控制器:

var model = new MyViewModel 
{ 
    SomeValue = await GetTheValue(); 
}; 
return View(model); 

並在視圖:

@Model.SomeValue 

該模型應該基本上是 「完全的」 時,它的給予渲染的視圖,視圖應該只是渲染它。異步操作應該在控制器中。


至於把太多的代碼在控制器和保持它在模型的選擇,你可以在模型上移動一個異步操作以某種初始化:

public class MyViewModel 
{ 
    public string SomeValue { get; private set; } 

    public async Task Initialize() 
    { 
     SomeValue = await GetTheValue(); 
    } 
} 

在隨後的控制你調用一個:

var model = new MyViewModel(); 
await model.Initialize(); 
return View(model); 

或許異步廠型號:

public class MyViewModel 
{ 
    public string SomeValue { get; private set; } 

    private MyViewModel() { } 

    public static async MyViewModel Create() 
    { 
     return new MyViewModel 
     { 
      SomeValue = await GetTheValue() 
     }; 
    } 
} 

然後在控制器:

var model = await MyViewModel.Create(); 
return View(model); 

有多種方法去了解這一點,真的。最主要的是讓異步操作保持在視圖之外,其唯一的工作應該是在模型完成後呈現UI。

+0

好吧,這意味着我不得不重寫我的項目爲MVC 。有沒有辦法做到這一點與WebPages雖然(沒有模型或控制器)? – 2014-10-09 16:46:32

+0

@ArmanBimatov:哦,我以爲這是MVC。無論哪種方式,都適用相同的概念。渲染引擎應該只是渲染它所提供的數據。它不應該調用異步操作。這更像是WebForms嗎?在這種情況下,代碼隱藏將是異步操作發生的地方。 – David 2014-10-09 16:49:14

+0

@ArmanBimatov:如果沒有「代碼隱藏」,那麼你可以*嘗試*類似'var someValue = await GetTheValue();'或'var someValue = GetTheValue()。'結果;'這是一種垃圾拍攝這個「WebPages」的東西似乎模糊了服務器端應用程序主機結構。前一個選項可能在語法上不合法(如果渲染引擎的上下文不是'async'),則後者可能導致死鎖。如果系統以可衡量的複雜性增長,「WebPages」可能不是最好的方法。 – David 2014-10-09 16:58:28