【问题标题】:Razor Pages on async Get model is null异步获取模型上的 Razor 页面为空
【发布时间】:2019-09-27 06:56:12
【问题描述】:

我在 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。问题出在哪里?在同一个项目中,在没有异步的正常获取中,模型不为空。属性Accounts 设置为BindProperty

我做错了什么?

【问题讨论】:

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


    【解决方案1】:

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

    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 处理程序。框架认为它们是相同的。

    【讨论】:

    • 其他页面工作正常且模型(和所有其他数据)不为空。只有这个特定的有问题,而且无论我做什么,Model 始终为空。
    【解决方案2】:

    通过将async Task&lt;IActionResult 更改为async Task(并删除退货)解决了问题。任何人都可以解释有什么区别以及为什么会有所帮助?

    【讨论】:

      【解决方案3】:

      我在 public async void OnGetAsync() 上遇到了同样的问题 一旦我在 het 函数中添加了等待,我就在模型上得到了一个空引用异常。

      用公共异步任务 OnGetAsync() 替换确实解决了我的异常。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-03
        • 2018-10-05
        • 1970-01-01
        • 2015-03-14
        • 2021-12-29
        • 2019-12-28
        相关资源
        最近更新 更多