C# 如何在ASP.NET核心页面上提交帖子后刷新页面内容?
我正在使用ASP Net内核,我创建了一个带有Razor页面的项目 我有一个页面,列出了与当前用户关联的产品,他可以添加新产品 调用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)
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对象,以及当前完整的元素列表,并将其发送到服务器,以便对唯一的数据库事务应用更改 这将生成更少的网络流量、更少的数据库操作、更快、更可靠、允许更轻松地更新视图,并且几乎可以通过客户端代码完全管理
它不适用于某些场景,例如,如果您的元素集合需要由不同的用户同时修改,或由当前用户交互中的外部事件修改,但它是一种干净有效的方法,用于管理许多简单的用户交互,我们使用这种方法来以不必要的方式使其过于复杂。首先,这是一个很好的问题,谢谢你的提问 您试图实现的目标无法通过重定向实现。数据库将再次被调用,这是不可避免的。但是还有另一种方法,如果您真的不想从数据库请求数据两次,我建议您使用这种方法。下面我们来探讨一下: 调用
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>