ASP.NET MVC:页面加载即显验证消息,如何改为按钮点击时触发?
嘿,刚接触ASP.NET MVC遇到这个问题太正常了,我来帮你捋清楚怎么解决!页面加载就显示验证消息,大概率是ModelState初始状态带错误、视图写法不对,或者客户端验证触发时机不符合预期,咱们一步步来搞定:
1. 先检查控制器的GET方法
首先要确保返回视图的GET方法里,没有让ModelState带着错误返回。比如创建页面的GET方法,应该返回一个全新的空模型,而不是之前验证失败的模型:
public ActionResult Create() { // 返回干净的新模型,ModelState无错误,页面加载时就不会显示验证消息 return View(new TBL_USER()); }
如果是编辑页面,GET方法获取模型后,不要手动添加ModelState错误,也不要在这个阶段触发验证(比如调用ModelState.IsValid),除非你确实需要提前验证,但显然你现在不需要。
2. 确保视图里的验证消息写法正确
一定要用@Html.ValidationMessageFor助手来显示错误,它只会在ModelState对应字段有错误时才渲染内容,默认页面加载时ModelState是空的,所以不会显示:
@model final_1.Models.TBL_USER @using (Html.BeginForm("你的Action名", "控制器名", FormMethod.Post)) { <div class="form-group"> @Html.LabelFor(m => m.USERNAME) <!-- 假设你的Required字段是USERNAME --> @Html.TextBoxFor(m => m.USERNAME, new { @class = "form-control" }) <!-- 第三个参数留空避免硬编码错误,第四个参数可自定义错误样式 --> @Html.ValidationMessageFor(m => m.USERNAME, "", new { @class = "text-danger" }) </div> <button type="submit" class="btn btn-primary">提交</button> }
别自己硬写错误消息,一定要依赖ValidationMessageFor绑定ModelState的错误,这样才能保证只有验证失败时才显示。
3. 配置客户端验证(可选但推荐)
如果想让用户点击提交按钮时先在客户端完成验证(不用回发服务器),需要做好这几点:
- 在
web.config里启用客户端验证:
<appSettings> <add key="ClientValidationEnabled" value="true" /> <add key="UnobtrusiveJavaScriptEnabled" value="true" /> </appSettings>
- 在视图里按顺序引入必要的脚本:
<script src="~/Scripts/jquery.min.js"></script> <script src="~/Scripts/jquery.validate.min.js"></script> <script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>
默认情况下,jQuery Validate会在字段失去焦点、输入时触发验证,如果你想只有点击提交按钮时才触发客户端验证,可以加一段脚本修改验证配置:
$(document).ready(function() { // 针对当前表单修改验证触发时机 $('form').validate({ onfocusout: false, // 失去焦点时不验证 onkeyup: false, // 按键输入时不验证 onclick: false // 点击元素时不验证 }); });
这样就只有用户点击提交按钮时,才会触发验证并显示错误消息。
4. 排查ModelState提前有错误的情况
如果以上都做了还是页面加载就显示错误,那要检查是不是在GET方法里不小心给ModelState加了错误,比如:
public ActionResult Create() { // 这种写法会导致ModelState带错误,页面加载直接显示 ModelState.AddModelError("USERNAME", "用户名不能为空"); return View(new TBL_USER()); }
如果有这种代码,删掉就行——错误应该由提交后的POST方法来添加(或者由数据注解自动触发)。
内容的提问来源于stack exchange,提问作者user4221591

