c# - 在 Razor 页面中访问异步属性
问题描述
我正在尝试使用 Razor 页面构建一个简单的 .NET Core 2.0 Web 应用程序。该页面连接到一个同样简单的 Core 2.0 Web API。我有一个简单的课程:
public class About : PageModel
{
private ServiceProxy serviceProxy;
public About(ServiceProxy serviceProxy)
{
this.serviceProxy = serviceProxy;
}
public IEnumerable<ProductViewModel> Values { get; set; }
public async void OnGetAsync()
{
this.Values = await this.serviceProxy.GetValuesAsync();
}
}
页面也很简单:
@page
@model About
@{
ViewData["Title"] = "About";
}
<h2>@ViewData["Title"]</h2>
<h3>@Model.Message</h3>
@foreach (var product in @Model.Values)
{
<p>@product.Name</p>
}
但是,在OnGetAsync()
方法可以填充“值”列表之前显示页面。这似乎是一个很常见的操作,但我找不到任何关于它的讨论(我也尝试过迭代异步“GetValues()”方法)。
CSHTML 页面应该如何与可能需要几秒钟才能返回结果的 Web API 交互?
解决方案
那是因为async void
,这基本上是一个火灾和忘记,应该避免。该页面将在函数有时间完成之前加载,因为它们将并行执行。
将签名更改为,async Task
以便页面可以等待操作完成。
public async Task<IActionResult> OnGetAsync() {
this.Values = await this.serviceProxy.GetValuesAsync();
return Page();
}
推荐阅读
- react-native - 从 API 操作 SectionList
- reactjs - 如何在反应 useEffect 挂钩中清理放大异步身份验证功能?
- c# - 带有算术方法签名的接口名称
- css - 使样式表中的 URL 相对于当前位置而不是样式表的位置
- ios - 如何以编程方式在 iOS 配置文件和设备管理和信任存储中安装 VPN 根证书
- java - 通过 Java 在本地数据库上添加 SQL 记录
- c# - 在 asp.net 核心中折叠导航栏列表不起作用
- css - 如何禁用材质 UI 输入的波纹效果?
- python - 使用“modeBarButtonsToAdd”或“modeBarButtons”时,Dash 无法识别“drawclosedpath”按钮
- html - 网页中什么样的元素可以设置焦点?