如何在ModelState.IsValid为False时阻止FormMethod.Post跳转?
解决ModelState无效时仍跳转到Page2的问题
后端处理:拦截无效请求并返回原页面
你当前的Controller代码只实现了ModelState有效时的逻辑,未处理无效场景,导致请求继续进入Page2流程。只需补充ModelState无效时的分支逻辑,返回原始的Page1视图即可,同时保留模型和错误信息,让页面能正常显示验证提示。
修改后的Page1Controller代码:
[HttpPost] [ValidateAntiForgeryToken] public ActionResult Page2(GenericModel model) { if (ModelState.IsValid) { // 这里编写Model验证通过后的业务逻辑,比如数据保存、跳转成功页等 return RedirectToAction("Success"); } // Model验证失败时,返回Page1视图,携带模型和错误信息 return View("Page1", model); }
前端客户端验证:提前阻止无效提交
如果想在用户点击提交时就完成验证,避免请求发到后端,可以启用ASP.NET的非侵入式验证:
- 给模型类添加验证特性
在GenericModel类中,为需要验证的属性加上DataAnnotations验证标记:
public class GenericModel { [Required(ErrorMessage = "此字段为必填项")] public string UserName { get; set; } [EmailAddress(ErrorMessage = "请输入合法的邮箱格式")] public string Email { get; set; } }
- 在视图中添加验证提示控件
修改Page1.cshtml的表单代码,加入验证相关的辅助方法:
@using (Html.BeginForm("Page2", "Page1", FormMethod.Post)) { @Html.AntiForgeryToken() <!-- 显示全局验证摘要 --> @Html.ValidationSummary(true, "", new { @class = "text-danger" }) <div class="form-group"> @Html.LabelFor(m => m.UserName) @Html.TextBoxFor(m => m.UserName, new { @class = "form-control" }) <!-- 显示单个字段的验证错误 --> @Html.ValidationMessageFor(m => m.UserName, "", new { @class = "text-danger" }) </div> <div class="form-group"> @Html.LabelFor(m => m.Email) @Html.TextBoxFor(m => m.Email, new { @class = "form-control" }) @Html.ValidationMessageFor(m => m.Email, "", new { @class = "text-danger" }) </div> <button type="submit" class="btn btn-primary">提交</button> }
- 确保引入验证脚本
在视图或布局页(_Layout.cshtml)中引入jQuery验证相关脚本:
<script src="~/Scripts/jquery.validate.min.js"></script> <script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>
启用客户端验证后,用户点击提交时会先在浏览器端完成验证,不符合规则的话会直接显示错误提示,不会发起POST请求到后端。
内容的提问来源于stack exchange,提问作者user153923
相关产品推荐
相关产品推荐

