异步获取模型上的Razor Pages为空

时间:2019-09-27 06:56:12

标签: c# asp.net-core razor razor-pages

我在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

我做错了什么?

2 个答案:

答案 0 :(得分:1)

您是否尝试添加新的剃须刀页面项目进行测试?如果_其他一切都是“标准” _,则应该正常获取该值。

OnGetOnGetAsync之间没有实际差异。 OnGetAsync只是包含异步代码的方法的命名约定,该异步代码应在发出GET请求时执行。您可以省略后缀Async,但仍使方法异步:

public async Task OnGet()
{
    ...
    await ....
    ...
}

异步方法是在执行过程中释放线程的方法,以便可以将其用于其他用途,直到执行结果可用为止。您可以在此处详细了解异步方法的工作原理:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/async/#BKMK_WhatHappensUnderstandinganAsyncMethod

同一剃刀页面中不能有OnGetOnGetAsync处理程序。该框架认为它们是相同的。

答案 1 :(得分:1)

通过将async Task<IActionResult更改为async Task(并除去收益)来解决问题。任何人都可以解释有什么区别以及为什么有帮助吗?