Razor Pages点击点赞后OnPost执行导致OnGet变量重置为null求助
解决Razor Pages点赞后ArgumentNullException(变量为null)的问题
这个问题的核心原因很清晰:当你点击点赞按钮触发OnPost方法后,页面会重新渲染,但**OnPost并没有初始化那些原本在OnGet里赋值的变量(比如_bookTags、someVariable1)**,这些属性会保持null状态,当页面执行@foreach(string x in Model._bookTags)时,自然就会抛出ArgumentNullException。
下面给你几种可行的解决方案,按推荐程度排序:
方案1:采用PRG模式(Post/Redirect/Get,最推荐)
这种方式可以避免用户刷新页面重复提交点赞,同时彻底解决变量null的问题,因为重定向会重新触发OnGet方法,所有变量都会被重新初始化。
修改你的OnPost方法,将返回类型改为IActionResult,并在最后重定向到当前页面:
public IActionResult OnPost(){ // 原有点赞逻辑 likes newLike = new likes(); newLike.userName = HttpContext.User.Identity.Name.Split("\\")[1]; newLike.book = bookName; // 可选:添加重复点赞判断,避免同一用户重复点赞 var existingLike = _context.likes.FirstOrDefault(u => u.userName == newLike.userName && u.book == newLike.book); if(existingLike == null){ _context.likes.Add(newLike); _context.SaveChanges(); } // 重定向到当前页面,重新执行OnGet初始化所有变量 return RedirectToPage(); }
注意:如果bookName是通过路由/查询参数传递的,需要给bookName属性加上[BindProperty(SupportsGet = true)],确保重定向后能正确获取到值:
[BindProperty(SupportsGet = true)] public string bookName {get;set;}
方案2:在OnPost中复用OnGet的初始化逻辑
如果不想用重定向,可以直接在OnPost方法末尾调用OnGet(),让所有变量重新赋值:
public void OnPost(){ // 原有点赞逻辑 likes newLike = new likes(); newLike.userName = HttpContext.User.Identity.Name.Split("\\")[1]; newLike.book = bookName; _context.likes.Add(newLike); _context.SaveChanges(); // 调用OnGet重新初始化所有页面变量 OnGet(); }
这种方式简单直接,但缺点是用户刷新页面会重复提交点赞请求,不够健壮。
方案3:提取公共初始化方法(代码更整洁)
把OnGet里的初始化逻辑抽成一个私有方法,在OnGet和OnPost中都调用,避免代码重复:
private void LoadPageData(){ someVariable1 = (from u in _context.table where something==something select u.x); _bookTags= (from u in _context.bookTags where something==something select u.y).ToList(); LikeCounter = (from u in _context.likes where u.book==bookName select u).Count(); } public void OnGet(){ LoadPageData(); } public IActionResult OnPost(){ // 点赞逻辑(同上) likes newLike = new likes(); newLike.userName = HttpContext.User.Identity.Name.Split("\\")[1]; newLike.book = bookName; var existingLike = _context.likes.FirstOrDefault(u => u.userName == newLike.userName && u.book == newLike.book); if(existingLike == null){ _context.likes.Add(newLike); _context.SaveChanges(); } // 选择PRG模式重定向,或者直接调用初始化方法 return RedirectToPage(); // 或者:LoadPageData(); return Page(); }
内容的提问来源于stack exchange,提问作者Aru
相关产品推荐
相关产品推荐

