.NET Core 2.0中Unobtrusive Ajax服务端验证技术咨询
排查.NET Core 2.0中Unobtrusive Ajax服务端验证问题
结合你的代码和使用场景,我帮你梳理几个关键问题点及解决方案:
1. 自定义验证属性的访问权限与空值处理问题
你的NeverAttribute是私有内部类(默认class无修饰符为private),模型验证框架无法通过反射创建它的实例,导致这个验证规则根本不会被执行。另外,代码里没有处理value为null的情况,直接调用ToString()会抛出空引用异常。
修改后的验证属性代码:
public class NeverAttribute : ValidationAttribute { public override bool IsValid(object value) { // 先判断value是否为null,再比较字符串 return value?.ToString() != "never"; } }
2. Unobtrusive Ajax提交时的验证反馈处理
当使用Ajax提交表单时,服务端验证失败后需要正确返回分部视图,确保页面能显示错误信息:
调整控制器动作方法
确保验证失败时返回分部视图,而不是完整视图:
[HttpPost] public IActionResult Create(Blog blog) { if (!ModelState.IsValid) { // 返回创建分部视图,保留用户输入和验证错误 return PartialView("_CreateBlog", blog); } // 执行博客保存逻辑... // 验证成功后返回JSON,用于前端跳转或提示 return Json(new { success = true, redirectUrl = Url.Action("Index") }); }
确保分部视图包含验证标签助手
你的分部视图必须包含验证摘要和字段级验证标签,才能显示错误信息:
<div asp-validation-summary="ModelOnly" class="text-danger"></div> <div class="form-group"> <label asp-for="Url" class="control-label"></label> <input asp-for="Url" class="form-control" /> <span asp-validation-for="Url" class="text-danger"></span> </div> <!-- 其他表单字段 -->
配置Unobtrusive Ajax表单
在表单上添加正确的Ajax属性,指定验证失败后替换页面中的容器:
<!-- 假设你的分部视图被包裹在id为blogFormContainer的容器中 --> <div id="blogFormContainer"> <form asp-action="Create" data-ajax="true" data-ajax-method="POST" data-ajax-update="#blogFormContainer" data-ajax-mode="replace"> <!-- 表单内容 --> <button type="submit" class="btn btn-primary">保存</button> </form> </div>
data-ajax-update指定了验证失败后,用返回的分部视图替换哪个元素,这样错误信息会直接显示在原表单位置。
3. 确保Unobtrusive Ajax脚本正确引入
在.NET Core 2.0中,需要按顺序引入依赖脚本:
<script src="~/lib/jquery/dist/jquery.min.js"></script> <script src="~/lib/jquery-validation/dist/jquery.validate.min.js"></script> <script src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"></script> <script src="~/lib/jquery-unobtrusive-ajax/jquery.unobtrusive-ajax.min.js"></script>
注意顺序:jQuery必须最先加载,然后是验证脚本,最后是Unobtrusive Ajax脚本,否则会导致功能失效。
按以上步骤调整后,你的服务端验证应该就能正常工作,并且在Unobtrusive Ajax提交时正确显示错误信息了。
内容的提问来源于stack exchange,提问作者Neville Nazerane
相关产品推荐
相关产品推荐

