Бритва Страницы на асинхронном Получить модель не имеет значения - PullRequest
1 голос
/ 27 сентября 2019

У меня интересная проблема со страницами Razor на Asp.Net Core 2.2.У меня есть страница (не частичная, обычная страница) с async 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 is null.

 @foreach(var account in Model.Accounts)
 {
     <tr>
     ...
     </tr>
 }

И, конечно, я получаю исключение NullReferenceException для Model.Accounts.В чем проблема?В том же проекте, в обычном Get без асинхронного, Model не является нулевым.Propery Accounts установлен как BindProperty.

Что я делаю не так?

Ответы [ 3 ]

1 голос
/ 27 сентября 2019

Вы пытались добавить новый элемент страницы бритвы для проверки?Если _ все остальное "стандартное" _, оно должно получить значение как обычно.

Фактической разницы между 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 на одной странице Razor.Каркас видит их как одинаковые.

0 голосов
/ 30 сентября 2019

Проблема решена изменением с async Task<IActionResult на async Task (и удалением возвратов).Кто-нибудь может объяснить, в чем разница и почему это помогло?

0 голосов
/ 27 сентября 2019

Вы уже добавили [BindProperty] в свой код?

Как-то так

[BindProperty]
public Customer Customer { get; set; }

public async Task<IActionResult> OnGetAsync(int id)
{
    Customer = await _context.Customers.FindAsync(id);

    if (Customer == null)
    {
        return RedirectToPage("./Index");
    }

    return Page();
}

Так что, возможно, ваш код будет

[BindProperty]
public List<DbAccount> Accounts { get; set; }

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();
    }
}

Вы можете проверитьполный код здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...