提问人:SC.Cee 提问时间:4/26/2021 更新时间:4/26/2021 访问量:349
.Net Core 服务器端模型验证 通过不显眼的 ajax 表单进行验证
.Net Core Server Side Model Validation via unobtrusive ajax form
问:
我有一个视图,它使用不显眼的ajax来提交表单,或者更确切地说,只是普通的jquery ajax也可以解决问题。对于这两种实现,我都可以让它很好地击中我的控制器并执行我的 ModelState.IsValid 验证,然后返回我的视图,如下所示:
public ActionResult SubmitForm(ViewModel viewModel)
{
if(!ModelState.IsValid)
{
return View("~/view path", viewModel);
}else
{
// do stuff
// I have to return this in order for me to get my model validation errors to show up
return Json(new { msg = "OK" });
}
}
视图:
<form asp-action="SubmitForm" asp-controller="Controller" data-ajax="true" data-ajax-method="POST"
data-ajax-success="onSubmitSuccess(data, 'formId')" id="formId">
@Html.ValidationSummary()
// some form fields with html tag helpers
</form>
现在,当我的 SubmitForm 操作返回我对失败模型验证的视图时,我的验证摘要永远不会显示。我让它工作的唯一方法是通过检查 json msg 属性,将我的整个表单 html 替换为我返回的数据,就像在我的 OnSubmitSuccess 函数中一样:
function onSubmitSuccess(data, form)
{
if(data.msg)
{
if(data.msg == "OK") { // do stuff }
}else
{
$("#" + form).html(data.responseText);
}
}
我基本上是用传入的响应文本替换我的表单 html,以便显示我的错误消息。有什么特殊的原因导致我不能只做一个返回部分或返回视图,而不用修补jquery和替换html?
谢谢
答:
0赞
Brando Zhang
4/26/2021
#1
据我所知,data-ajax-success 需要包含三个参数的函数,我们无法将 formid 作为参数传递给 data-ajax-success 函数。data, status, xhr
此外,如果要将部分视图作为返回结果传递给客户端,则应直接使用 data 而不是 来显示视图内容值。data.responseText
更多细节,您可以参考下面的测试演示和代码:
@model DotNet5Identity.Models.GetInTouch
@{
ViewData["Title"] = "Index";
}
<h1>Index</h1>
<form asp-action="SubmitForm" asp-controller="GetInTouch" data-ajax="true" data-ajax-method="POST"
data-ajax-success="completed" id="formId">
<input asp-for="Id" />
<br />
<input asp-for="EmailAddress" />
<input type="submit" value="Tst" />
@Html.ValidationSummary()
// some form fields with html tag helpers
</form>
@section scripts{
<partial name="_ValidationScriptsPartial" />
<script>
completed = function (data, status, xhr) {
alert(data.msg);
if (data.msg == "OK") {
} else {
$("#formId").html(data);
}
};
</script>
}
控制器:
public ActionResult SubmitForm(GetInTouch viewModel)
{
return PartialView("_TestPartialView");
// do stuff
// I have to return this in order for me to get my model validation errors to show up
return Json(new { msg = "OK" });
}
结果:
评论