首页 > 解决方案 > 如果不满足条件,则从公共异步任务 OnGetAsync() 重定向到不同的 Razor 页面

问题描述

我是“异步”和“任务”的新手。我似乎无法在 OnGetAsync() 中使用简单的 if{} else{}。

public async Task OnGetAsync()
{
    if (HttpContext.Session.GetString("LoggedStatus") != null)
    {
        //KEEP GOING
    Accounts = await _context.Accounts.ToListAsync();
    }
    else
    {
    RedirectToPage("./Index");
    } 
}

我得到的错误来自“帐户”页面,我试图通过使用我的主页“RedirectToPage(”./Index")”来避免靠近该页面。我尝试在 RedirectToPage 前面加上“return”字样,但是当我这样做时它变成了红色。此外,如果满足第一个条件(Session 对象中有一个值),Accounts 页面将显示没有错误。所以,我很确定问题出在我试图在“else”语句中重定向。

NullReferenceException: Object reference not set to an instance of an object.
OESAC.Pages.Accounts.Pages_Accounts_Index.ExecuteAsync() in Index.cshtml
+
        @foreach (var item in Model.Accounts)

上面的错误在 Accounts 中,它循环并显示行。我不确定为什么它甚至会到达 Accounts.chstml。

标签: asp.net-coreasync-awaitrazor-pagesasp.net-core-2.2

解决方案


您需要使用Task<IActionResult>in public async Task<IActionResult> OnGetAsync(),并结合return语句。

public async Task<IActionResult> OnGetAsync()
{
    if (HttpContext.Session.GetString("LoggedStatus") != null)
    {
        //KEEP GOING
        Accounts = await _context.Accounts.ToListAsync();

        return Page();
    }
    else
    {
        return RedirectToPage("./Index");
    } 
}

微软的文档在这里有一些很好的阅读:


根据评论,您可以运行此 w/o async。

public IActionResult OnGet()
{
    if (HttpContext.Session.GetString("LoggedStatus") != null)
    {
        //KEEP GOING
        Accounts = _context.Accounts.ToList();

        return Page();
    }
    else
    {
        return RedirectToPage("./Index");
    } 
}

推荐阅读