【问题标题】:ASP.net core 3.1 List is populated in the onGet but not in OnPost. What is the correct way to bind it?ASP.net core 3.1 List 填充在 onGet 中,但不在 OnPost 中。绑定它的正确方法是什么?
【发布时间】:2020-07-07 07:02:10
【问题描述】:

PostsList 已在 OnGet 方法中正确填充,并且在 HTML 中正确填充循环。在OnPostDeletePost 方法中,它为空。如何正确绑定列表,以便将其填充到整个模型中??

型号:

public List<Post> PostsList { get; set; }

public async Task OnGet(string userId){

    PostsList = await _db.Posts.Include(p => p.ApplicationUser).Where(p => p.ApplicationUserId == userId).OrderByDescending(x => x.DateTime).ToListAsync();

}


public async Task<IActionResult> OnPostDeletePost(int? postId)
{
    if(postId == null)
    {
        return NotFound();
    }

    var postToDelete = PostsList.FirstOrDefault(p => p.Id == postId);
    if(postToDelete == null)
    {
        return NotFound();
    }
    _db.Posts.Remove(postToDelete);
    await _db.SaveChangesAsync();
    return RedirectToPage("Profile", new { userId = ApplicationUser.Id });
}

【问题讨论】:

  • 每次有请求时都会创建一个新实例,因此您必须再次调用您的_db.....

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


【解决方案1】:

每个请求都是页面模型的一个新实例。 您可以告诉 MVC 从表单值绑定列表;

[BindProperty]
public List<Post> PostsList { get; set; }

但我假设您的意思是从数据库重新加载?请注意,您可以只加载要删除的记录;

var post = await _db.Posts.Where(p => p.Id == postId).SingleOrDefaultAsync()
...
_db.Posts.Remove(post);

【讨论】:

  • 您好 Jeremy,是的,我已经按照您在发布问题之前建议的方式加载了记录。我的问题是每次用户想要删除帖子时加载和解析整个 Posts 表似乎效率不高。我想在 OnGet 方法中加载一次,填充 public List PostsList { get;放; } 然后在 OnPost 方法中使用它。
  • 您不需要从数据库中加载记录来删除它。只要填充key和concurrency字段,就会生成正确的sql。例如_db.Posts.Remove(new Post{Id = postId});.
  • 这里的关键点是您不能在OnGetOnPost 之间共享任何状态,因为它们是单独的请求。
  • 我明白了,谢谢您的回复。您能否提供一些有关使用 signalR 与特定用户聊天的帮助。再次感谢您。
猜你喜欢
  • 2020-04-03
  • 1970-01-01
  • 2014-01-26
  • 2021-11-27
  • 2021-05-02
  • 2021-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多