ASP.NET MVC添加ModelState错误后重定向同页面无效问题排查
问题解决方法
核心问题
你用RedirectToPage重定向后,原Action中的ModelState不会被传递到新的Index页面请求中——因为重定向会触发全新的GET请求,之前的ModelState数据会被丢弃,所以Index页面的ViewData.ModelState.IsValid始终为true。
修复步骤
1. 修改控制器逻辑,用TempData传递错误信息
把原代码中添加Model错误的部分,替换为将错误消息存入TempData(会话临时存储,会在下次请求后自动清除):
public IActionResult GetAction([FromForm]string Name, [FromForm] string Email, [FromForm] string Query) { // 检查该邮箱是否已有消息记录(优化:去掉ToList(),直接用数据库查询) if (_dbCtx.ClientMessages.Any(x => x.Email == Email)) { // 获取该邮箱最后一次发送消息的时间(优化:按时间倒序取最新记录) var lastMessage = _dbCtx.ClientMessages.OrderByDescending(x => x.Time).FirstOrDefault(x => x.Email == Email); if (lastMessage != null) { // 简化时间计算逻辑 var elapsedTime = DateTime.Now - lastMessage.Time; if (elapsedTime.TotalMinutes < 30) { // 将错误消息存入TempData TempData["ErrorMessage"] = "每30分钟仅允许发送一条消息"; return RedirectToPage("/Index"); } } } // 后续的消息保存等逻辑... }
2. 修改Index页面,读取TempData显示错误
把模态框中检查ModelState的代码,改为检查TempData中的错误消息:
<div class="modal-header"> <h4 class="modal-title" id="myModalLabel">联系我们</h4> @if (TempData["ErrorMessage"] != null) { <span id="error-message" class="text-danger">@TempData["ErrorMessage"]</span> } <button type="button" class="close" onclick="closeModal()" aria-hidden="true">×</button> </div>
额外优化点
- 原代码中
_dbCtx.ClientMessages.ToList().Any(...)会把所有消息加载到内存再判断,直接用_dbCtx.ClientMessages.Any(...)让数据库层面完成查询,性能更好。 - 用
OrderByDescending(x => x.Time)确保拿到的是该邮箱最新的消息记录,避免取到旧数据导致时间判断错误。 - 时间计算简化为
DateTime.Now - lastMessage.Time,直接得到时间差,无需多余的TimeSpan.FromMinutes转换。
内容的提问来源于stack exchange,提问作者user16612111
相关产品推荐
相关产品推荐

