.NET Core 7 Razor Pages提交错误后下拉列表为空问题求助
.NET Core 7 Razor Pages 提交失败后保留下拉列表数据问题
我正在使用**.NET Core 7和Razor Pages**开发新增页面,需要在页面上做分类选择。OnGetAsync()方法里从数据库获取分类信息传到页面,这一步正常。提交表单时,OnPostAddAsync()执行保存操作,若保存出错,我用return Page()来保留用户输入内容,但此时下拉列表的分类信息会消失。不想用RedirectToPage(),因为会丢失用户输入,请问怎么在保留输入的同时重新填充分类下拉列表?
我的OnGetAsync()方法
public async Task<IActionResult> OnGetAsync() { var response = await _category.List(SessionValues()[0]); if (response.Message == "Authentication Error") { HttpContext.Session.Remove("userToken"); HttpContext.Session.Remove("userInfo"); return new RedirectToPageResult("Login"); } if (response.Status) { List<SelectListItem> List = new List<SelectListItem>(); foreach (var item in response.Data) { List.Add(new SelectListItem { Value = item.Id.ToString(), Text = item.Name }); Options = List; } } else { ToastrError = response.Message; } return Page(); }
我的OnPostAddAsync()方法
public async Task<IActionResult> OnPostAddAsync(AddRequestModel addModel) { var response = await _product.Add(SessionValues()[0]); if (response.Message == "Authentication Error") { HttpContext.Session.Remove("userToken"); HttpContext.Session.Remove("userInfo"); return new RedirectToPageResult("Login"); } if (response.Status) { ToastrSuccess = response.Message; return new RedirectToPageResult("Add"); } ToastrError = response.Message; return Page(); }
当保存出错时,代码会携带错误信息执行
return Page(),此时下拉列表为空。
我使用的属性
[ViewData] public string ToastrError { get; set; } [TempData] public string ToastrSuccess { get; set; } public AddRequestModel addModel { get; set; } public List<SelectListItem> Options { get; set; }
解决方案
问题核心是return Page()不会自动触发OnGetAsync()的下拉加载逻辑,所以需要在提交失败的分支里手动重新加载分类数据。
1. 提取加载分类的公共方法
把OnGetAsync()里的分类加载逻辑抽成独立方法,避免重复代码:
private async Task LoadCategoriesAsync() { var response = await _category.List(SessionValues()[0]); if (response.Message == "Authentication Error") { HttpContext.Session.Remove("userToken"); HttpContext.Session.Remove("userInfo"); throw new InvalidOperationException("Authentication Error"); } if (response.Status) { Options = response.Data.Select(item => new SelectListItem { Value = item.Id.ToString(), Text = item.Name }).ToList(); } else { ToastrError = response.Message; } }
2. 简化OnGetAsync()方法
修改原OnGetAsync(),调用公共方法:
public async Task<IActionResult> OnGetAsync() { try { await LoadCategoriesAsync(); } catch (InvalidOperationException ex) { if (ex.Message == "Authentication Error") { return new RedirectToPageResult("Login"); } throw; } return Page(); }
3. 在提交失败分支重新加载分类
修改OnPostAddAsync(),保存失败时先加载分类数据,再返回页面:
public async Task<IActionResult> OnPostAddAsync(AddRequestModel addModel) { var response = await _product.Add(SessionValues()[0]); if (response.Message == "Authentication Error") { HttpContext.Session.Remove("userToken"); HttpContext.Session.Remove("userInfo"); return new RedirectToPageResult("Login"); } if (response.Status) { ToastrSuccess = response.Message; return new RedirectToPageResult("Add"); } ToastrError = response.Message; // 重新加载分类数据 try { await LoadCategoriesAsync(); } catch (InvalidOperationException ex) { if (ex.Message == "Authentication Error") { return new RedirectToPageResult("Login"); } throw; } // 保留用户输入的表单数据 this.addModel = addModel; return Page(); }
补充说明
- 抽公共方法是为了统一维护分类加载逻辑,后续修改只需调整一处。
- 必须把提交的
addModel赋值给页面的addModel属性,才能保留用户输入的内容。 - 身份验证错误的判断可以改用自定义异常,比字符串匹配更规范。
内容的提问来源于stack exchange,提问作者OsKyy
相关产品推荐
相关产品推荐

