如何在 ASP.NET Core Razor Pages 上提交 Post 后刷新页面内容?

use*_*762 5 c# asp.net asp.net-core razor-pages

我正在使用 ASP Net Core,并使用 Razor Pages 创建了一个项目。

我有一个页面列出了与当前用户关联的产品,他可以添加新产品。

调用该方法后OnPost,我想刷新页面,使其显示用户的所有产品,而无需再次请求数据库

以下是我当前的解决方案:

    public async Task OnGet()
    {
        var currentUser = await GetCurrentUser();
        if (currentUser != null)
            Products = await _dbContext.Products.Where(x => x.AtpUserId == currentUser.Id).ToListAsync();
    }

    public async Task OnPost(Product product)
    {
        var currentUser = await GetCurrentUser();
        if (currentUser != null)
        {
            product.UserId = currentUser.Id;
            product.Currency = "USD";
            await _dbContext.Products.AddAsync(product);
            await _dbContext.SaveChangesAsync();
            Products = await _dbContext.Products.Where(x => x.UserId == currentUser.Id).ToListAsync(); // can I avoid this ?
        }
    }
Run Code Online (Sandbox Code Playgroud)

我不知道如何在没有从数据库重新加载数据的最后一行的情况下获得相同的结果。

  • 我查看了一些示例,但脚手架页面中的示例都使用中间Create页面,然后重定向到该Index页面。我希望用户能够从索引页面创建
  • OnPost我尝试通过调用替换该方法的最后一行RedirectToPage("Index");,但该方法OnGet不会再次调用,并且包含产品的表在刷新时为空。为什么?

Bar*_*rdo 0

根据我的经验,管理网页上元素列表的最佳方法是在客户端代码上管理它们,并在用户提交时查询数据库。

我将尝试进一步详细说明:

如果您有一个显示元素列表的页面,并且您的用户可以从那里添加、修改或删除元素,那么最好的方法(恕我直言)如下:

- 使用从数据库获取的当前信息加载页面(您可以将该信息的表示形式存储在客户端代码中,例如存储在 JSON 对象上)。

- 让您的用户管理页面上的信息。当他添加新元素时,您会更新 JSON 对象上的信息并将其反映在屏幕上,但在提交更改之前不要与数据库联系。

-您可以对更新或删除进行相同的操作,始终维护主 JSON 对象中的实际信息,但无需调用服务器进行任何操作。

- 操作完成后(这可能意味着很多不同的事情,具体取决于您的业务模型),您将获得更新的 JSON 对象以及当前完整的元素列表,并将其发送到服务器以对唯一的数据库事务应用更改。

这会产生更少的网络流量、更少的数据库操作,速度更快、更可靠,允许更轻松地更新视图,并且几乎可以完全通过客户端代码进行管理。

它不能应用于某些场景,例如,如果您的元素集合需要由不同的用户同时修改,或者由当前用户交互之外的外部事件修改,但它是管理许多简单用户交互的干净而有效的方法我们用不必要的方式使其变得过于复杂。