ASP.Net Core:Get请求页面加载触发数据注解验证的问题
问题描述
通过Get方法加载新页面时,数据验证被执行,页面加载后抛出验证错误,但确认当前是Get请求。
场景详情
视图中的添加学生按钮代码:
<a type="button" id="btnAddStudent" href='@Url.Action("Details","Student")' class="btn btn-tertiary" title="Add Student">Add Student</a>
Student控制器的Details Get方法代码:
[HttpGet] public ActionResult Details(StudentInfo model) { //This is populating the model parameters as expected. helper.StudentInfo(ref model); return View(model); }
Details视图包含提交表单,页面加载时抛出验证错误,已确认请求进入Get方法,且无页面加载时的验证脚本。
问题原因
你的Get方法直接接收StudentInfo作为参数模型,而这个模型类大概率带有数据验证注解(比如[Required]、[StringLength]等)。ASP.NET MVC的模型验证机制会在任何模型绑定完成后自动执行,不管是Get还是Post请求。当发起Get请求时,默认模型绑定会创建一个空的StudentInfo实例,空模型的必填字段自然不满足验证规则,返回视图时就会携带验证错误信息,导致页面加载后显示验证提示。
解决方案
有两种常用的解决方式:
方式一:Get方法不接收模型参数,手动初始化模型
修改Get方法,不在参数中接收模型,而是在方法内部创建新实例并填充数据:[HttpGet] public ActionResult Details() { StudentInfo model = new StudentInfo(); helper.StudentInfo(ref model); return View(model); }这种方式下不会触发模型绑定,也就不会提前执行验证,只有Post提交表单时才会验证用户输入的模型数据。
方式二:在Get请求时清除模型验证错误
如果必须保留模型作为参数(比如需要从URL接收部分参数),可以在返回视图前清空模型状态的验证错误:[HttpGet] public ActionResult Details(StudentInfo model) { helper.StudentInfo(ref model); // 清除模型验证错误 ModelState.Clear(); return View(model); }ModelState.Clear()会清空所有验证错误信息,确保页面加载时不会显示验证提示。
内容的提问来源于stack exchange,提问作者TheFallenOne
相关产品推荐
相关产品推荐

