正在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视图中正确调用异步方法的参考/示例。
从我的一个视图调用异步方法
不要从视图中调用方法。视图实际上应该只是绑定到模型上的数据。如果要执行异步操作来获取模型的数据,请在填充模型时在控制器中执行该操作。
作为一个人为的例子:
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。