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

本文关键字:等待 任务 视图 Razor ASP NET WebPages 正在 | 更新日期: 2023-09-27 18:26:02

我正在使用async/await,并从我的一个视图中调用一个异步方法,我需要等待它完成。我看到了很多ASP.NET MVC的例子,在这些例子中,您只需在操作的签名中添加一个"异步"即可。但是我还没有看到任何ASP.NET网页的例子。

我只是在Razor视图中对返回的任务调用"Wait()"吗?我看到了针对Wait()的建议。

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

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

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

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

作为一个人为的例子:

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。