等待ASP.NET WebPages Razor视图中的任务

Arm*_*tov 0 c# asp.net razor async-await asp.net-webpages

我正在使用async/await,并从我的一个视图中调用异步方法,我需要等到它完成.我已经看过很多ASP.NET MVC的例子,你可以在你的行动签名中加入"异步".但我还没有看到ASP.NET WebPages的任何示例.

我只是在Razor视图中的返回任务上调用"Wait()"吗?我见过针对Wait()的建议.

请给我一些关于如何在WebPages的Razor视图中正确调用异步方法的参考/示例.

Dav*_*vid 5

从我的一个视图调用异步方法

不要在视图中调用方法.该视图应该只是绑定到模型上的数据.如果要执行异步操作以获取模型的数据,请在填充模型时在控制器中执行该操作.

作为一个人为的例子:

public class MyViewModel
{
    public string SomeValue { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

并在控制器中:

var model = new MyViewModel
{
    SomeValue = await GetTheValue();
};
return View(model);
Run Code Online (Sandbox Code Playgroud)

并在视图中:

@Model.SomeValue
Run Code Online (Sandbox Code Playgroud)

当模型被赋予要渲染的视图时,模型应该基本上是"完整的",并且视图应该只是渲染它.异步操作应该在控制器中.


作为在控制器中放置太多代码并将其保留在模型中的替代方法,您可以将异步操作移动到模型上的某种初始化:

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

    public async Task Initialize()
    {
        SomeValue = await GetTheValue();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在你的控制器中你调用:

var model = new MyViewModel();
await model.Initialize();
return View(model);
Run Code Online (Sandbox Code Playgroud)

或者可能是模型上的异步工厂:

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

    private MyViewModel() { }

    public static async MyViewModel Create()
    {
        return new MyViewModel
        {
            SomeValue = await GetTheValue()
        };
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在控制器中:

var model = await MyViewModel.Create();
return View(model);
Run Code Online (Sandbox Code Playgroud)

真的,有很多方法可以解决这个问题.主要的是将异步操作保持在视图之外,其唯一的工作应该是在模型完成后呈现UI.