Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在ASP.NET核心页面上提交帖子后刷新页面内容?_C#_Asp.net_Asp.net Core_Razor Pages - Fatal编程技术网

C# 如何在ASP.NET核心页面上提交帖子后刷新页面内容?

C# 如何在ASP.NET核心页面上提交帖子后刷新页面内容?,c#,asp.net,asp.net-core,razor-pages,C#,Asp.net,Asp.net Core,Razor Pages,我正在使用ASP Net内核,我创建了一个带有Razor页面的项目 我有一个页面,列出了与当前用户关联的产品,他可以添加新产品 调用OnPost方法后,我想刷新页面,以便在不再次请求数据库的情况下显示用户的所有产品 以下是我当前的解决方案: public async Task OnGet() { var currentUser = await GetCurrentUser(); if (currentUser != null)

我正在使用ASP Net内核,我创建了一个带有Razor页面的项目

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

调用
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 ?
        }
    }
如果没有最后一行从数据库重新加载数据,我无法找到如何实现相同的结果

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

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

我将尝试进一步阐述:

如果您有一个显示元素列表的页面,并且您的用户可以在其中添加、修改或删除元素,那么最好的方法(IMHO)是:

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

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

-在更新或删除时也可以这样做,始终保持主JSON对象中的实际信息,但不调用服务器进行任何操作

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

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


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

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

我将尝试进一步阐述:

如果您有一个显示元素列表的页面,并且您的用户可以在其中添加、修改或删除元素,那么最好的方法(IMHO)是:

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

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

-在更新或删除时也可以这样做,始终保持主JSON对象中的实际信息,但不调用服务器进行任何操作

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

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


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

首先,这是一个很好的问题,谢谢你的提问

您试图实现的目标无法通过重定向实现。数据库将再次被调用,这是不可避免的。但是还有另一种方法,如果您真的不想从数据库请求数据两次,我建议您使用这种方法。下面我们来探讨一下:

调用
OnPost
时,您需要将
Products
数据传回模型。这意味着您必须绑定该数据,以便在提交后将其与表单数据一起传递给模型

首先,在Razor页面模型中用
[BindProperty]
标记产品属性,然后在HTML中添加
。这将与表单提交一起提交您的
产品
数据

现在在您的
OnPost
中,产品将有一个值,因为它将被绑定。当
OnPost
返回
Page
时,
@Model.Products
将具有从初始
OnGet
检索到的相同值。我以前做过这件事,而且很成功,所以我可以向你保证它会成功的


下面是一些示例代码:

public class SomePageModel{

  [BindProperty]
  public IList<Product> Products {get; set;}
  
  [BindProperty]
  public Product Product {get; set;}
  
  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()
  {
      var currentUser = await GetCurrentUser();
      if (currentUser != null)
      {
          Product.UserId = currentUser.Id;
          Product.Currency = "USD";
          await _dbContext.Products.AddAsync(Product);
          await _dbContext.SaveChangesAsync();
      }
  }
}
公共类模型{
[BindProperty]
公共IList产品{get;set;}
[BindProperty]
公共产品产品{get;set;}
公共异步任务OnGet()
{
var currentUser=等待GetCurrentUser();
如果(currentUser!=null)
产品=等待_dbContext.Products。
<form method="POST">
  <input type="hidden" asp-for="Products" value="PassProductsAsJSONString" />
</form>