我在Asp.Net Core 2.2上的Razor页面遇到了一个有趣的问题。我有一个带有异步get的页面(非局部页面,普通页面):
public async Task<IActionResult> OnGetAsync()
{
Accounts = new List<DbAccount>();
AccountRequest accountRequest = new AccountRequest(User.FindFirst("BearerToken").Value);
await ClientRequest.ExecuteRequest(accountRequest);
if (accountRequest.StatusCode != HttpStatusCode.OK)
{
ModelState.AddModelError("ERROR", "Login error");
return Page();
}
else
{
var data = JsonConvert.DeserializeObject<List<DbAccount>>(accountRequest.ResponseContent);
Accounts.AddRange(data);
return Page();
}
}
Get正常执行,并且Accounts.AddRange()中有要添加的数据,但是在页面的稍后,当我尝试遍历该集合时,Model为null。
@foreach(var account in Model.Accounts)
{
<tr>
...
</tr>
}
当然,我在Model.Accounts上收到NullReferenceException。问题出在哪里?在同一项目中,在没有异步的正常Get中,Model不为null。属性Accounts
设置为BindProperty
。
我做错了什么?
答案 0 :(得分:1)
您是否尝试添加新的剃须刀页面项目进行测试?如果_其他一切都是“标准” _,则应该正常获取该值。
OnGet
和OnGetAsync
之间没有实际差异。 OnGetAsync
只是包含异步代码的方法的命名约定,该异步代码应在发出GET请求时执行。您可以省略后缀Async
,但仍使方法异步:
public async Task OnGet()
{
...
await ....
...
}
异步方法是在执行过程中释放线程的方法,以便可以将其用于其他用途,直到执行结果可用为止。您可以在此处详细了解异步方法的工作原理:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/async/#BKMK_WhatHappensUnderstandinganAsyncMethod
同一剃刀页面中不能有OnGet
和OnGetAsync
处理程序。该框架认为它们是相同的。
答案 1 :(得分:1)
通过将async Task<IActionResult
更改为async Task
(并除去收益)来解决问题。任何人都可以解释有什么区别以及为什么有帮助吗?