ASP.NET MVC Model验证在用户更新功能中不生效问题咨询
问题根因
你当前更新功能验证不触发的核心问题是视图代码中的表单标签提前闭合:你的<form>标签仅包裹了标题<h2>Update Your Account</h2>就执行了</form>闭合,后续所有输入框、提交按钮都处于表单范围之外,点击提交按钮时不会将字段内容提交到后端,自然无法触发Model验证,同时客户端验证也不会对表单外的控件生效。
修复步骤
1. 修正表单闭合位置
将视图中的</form>标签移动到所有表单元素的末尾,也就是放在提交按钮所在行、提示信息代码块的后方,确保所有输入控件、提交按钮都被<form>标签包裹:
@model SysUser <form asp-controller="Account" asp-action="UserUpdate" method="post"> <div class="form-group row"> <div class="offset-sm-0 col-sm-4"> <h2>Update Your Account</h2> </div> </div> <!-- 原表单外的所有输入控件、提交按钮都放在form内部 --> <div class="form-group row"> <label class="control-label col-sm-2" asp-for="InvestorId">User ID :</label> <div class="col-sm-4"> <input type="text" asp-for="InvestorId" readonly="readonly" class="form-control" /> </div> <div class="col-sm-3"> <span asp-validation-for="InvestorId" class="text-danger"></span> </div> </div> <!-- 其余的姓名、邮箱、密码、联系方式等输入控件代码保持不变,全部放在form内部 --> <div class="form-group row"> <div class="offset-sm-2 col-sm-6"> <input type="submit" value="Submit" class="btn btn-primary" /> </div> </div> @if (ViewData["Message"] != null) { <div class="form-group row"> <div class="alert alert-@ViewData["MsgType"]"> <text>@ViewData["Message"]</text> </div> </div> } </form> <!-- 把闭合标签移到此处 -->
2. 补充客户端验证脚本引用
确认视图底部引入了验证脚本(通常ASP.NET Core项目默认会封装为_ValidationScriptsPartial分部视图),未添加会导致前端客户端验证不生效:
@section Scripts { @{await Html.RenderPartialAsync("_ValidationScriptsPartial");} }
其他可优化/修复点
- 修正Controller中的SQL语法错误:你当前的UPDATE语句中
FullName = '(2)'的占位符写为了圆括号,需要改为花括号FullName = '{2}',同时InvestorPw = ('SHA1', '{1}')的语法不符合SQL标准,建议改为InvestorPw = HASHBYTES('SHA1', '{1}')。 - 避免SQL注入风险:你当前直接拼接SQL字符串的写法存在SQL注入漏洞,建议改为参数化查询实现数据更新。
- 适配更新场景的验证规则:当前SysUser模型的密码字段为必填项,如果用户更新信息时不需要修改密码,留空会触发验证失败,建议拆分注册、更新场景的ViewModel,或者添加条件验证规则。
内容的提问来源于stack exchange,提问作者jiahao zhou
相关产品推荐
相关产品推荐

