首页 > 解决方案 > ASP.net core 3.1 List 填充在 onGet 但不在 OnPost 中。绑定它的正确方法是什么?

问题描述

在方法中正确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 });
}

标签: c#asp.net-coremodel-bindingrazor-pagesasp.net-core-3.1

解决方案


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

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

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

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

推荐阅读