簡體   English   中英

Razor 異步獲取的頁面 model 是 null

[英]Razor Pages on async Get model is null

我在 Asp.Net Core 2.2 上的 Razor 頁面遇到了有趣的問題。 我有一個帶有異步獲取的頁面(不是部分的正常頁面):

    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。 問題出在哪里? 在同一個項目中,在沒有異步的正常獲取中,Model 不是 null。 屬性Accounts設置為BindProperty

我做錯了什么?

您是否嘗試添加新的 razor 頁面項目進行測試? 如果_其他一切都是“標准”_,它應該正常獲取值。

OnGetOnGetAsync之間沒有實際區別。 OnGetAsync只是包含異步代碼的方法的命名約定,該代碼應在發出 GET 請求時執行。 您可以省略Async后綴,但仍使方法異步:

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

異步方法是在它們執行時釋放它們的線程以便它可以用於其他事情直到執行結果可用的方法。 您可以在此處閱讀有關異步方法如何工作的更多信息: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/async/#BKMK_WhatHappensUnderstandinganAsyncMethod

您不能在同一個 Razor 頁面中擁有OnGetOnGetAsync處理程序。 該框架認為它們是相同的。

通過從async Task<IActionResultasync Task (並刪除返回)解決了問題。 任何人都可以解釋有什么區別以及為什么有幫助?

我對 public async void OnGetAsync() 有同樣的問題只要我在 het function 中添加了一個等待,我就在 model 上遇到了一個空引用異常。

用公共異步任務 OnGetAsync() 替換確實解決了我的異常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM