C# ASP.NET Core 2.1不引人注目的Ajax验证不适用于部分视图表单交换
我花了几个小时梳理了Stackoverflow和其他网站,尝试了所有人的解决方案,但到目前为止运气都不好。我肯定我错过了什么,但我看不到。希望你能给我指出一个解决办法 我在局部视图中有一个初始表单,它被渲染成一个父视图,父视图的验证工作正常。一旦表单通过ajaxreplace提交,我将在响应中返回带有新表单的登录或注册部分视图。当提交不完整的表单并返回相同的部分视图时,第二个表单将不会显示模型验证错误 提前感谢您为结束这种疯狂行为提供的任何提示 父视图部分 登录部分视图(验证错误显示不工作) 客户端初始化代码 更新 我已经将父页面(index.cshtml)更新为以下内容,但它仍然没有显示消息C# ASP.NET Core 2.1不引人注目的Ajax验证不适用于部分视图表单交换,c#,asp.net-core-mvc,unobtrusive-validation,asp.net-core-2.1,C#,Asp.net Core Mvc,Unobtrusive Validation,Asp.net Core 2.1,我花了几个小时梳理了Stackoverflow和其他网站,尝试了所有人的解决方案,但到目前为止运气都不好。我肯定我错过了什么,但我看不到。希望你能给我指出一个解决办法 我在局部视图中有一个初始表单,它被渲染成一个父视图,父视图的验证工作正常。一旦表单通过ajaxreplace提交,我将在响应中返回带有新表单的登录或注册部分视图。当提交不完整的表单并返回相同的部分视图时,第二个表单将不会显示模型验证错误 提前感谢您为结束这种疯狂行为提供的任何提示 父视图部分 登录部分视图(验证错误显示不工作) 客
<div class="row">
<div class="col-sm-8 col-sm-offset-2">
<div class="panel panel-primary" id="formData">
@await Html.PartialAsync("_UserNamePartial", new UserNameViewModel())
</div>
</div>
</div>
@section Scripts
{
@{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
}
@等待Html.partialSync(“\u usernameportial”,new UserNameViewModel())
@节脚本
{
@{wait Html.RenderPartialAsync(“_validationScript”);}
}
很确定这违反了路径
if(!ModelState.IsValid)
return PartialView("../Home/_UserNamePartial", model);
问题是我没有使用asp作为标记助手。这些助手负责生成不引人注目的验证解析器所需的data-*属性。一旦我开始使用它们,它就开始工作了。感谢每一位试图帮助我们的人 修正视图
@Html.AntiForgeryToken()
记得我吗
忘记密码了?
剪切渲染部分链接并粘贴到@script部分之前,如下所示:
@{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
@section Scripts
{
}
最后,您在哪里定义了注入
\u validationscripttial
的部分?或者您正在进行自己的验证?我正在使用_Layout.cshtml来包含验证脚本:这可能是问题的一部分。。。我只在@部分脚本{}
中使用验证,因为现在在_layoutThanks中验证一直处于活动状态。这是我在做了很多MVC4应用之后的第一个核心mvc应用。我不知道新的验证脚本。我修改了索引页面,将其包含在脚本部分。初始局部视图验证得很好。ajax加载的表单仍然没有显示验证错误。我想我最好先浏览一下不引人注意的源代码,看看我遗漏了什么。您应该在加载表单的ajax调用的成功回调中重新解析$.validator
(将部分添加到DOM之后)。脚本永远不应该出现在局部视图中。感谢您的注意。我更新了代码。仍在搜索修复错误显示。感谢@StephenMuecke的更正。我是否只需单击“添加另一个答案”添加解决方案?
@model Inshora.Models.Account.LoginViewModel
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="panel-heading">
<h3 class="panel-title">Log Into Your Account</h3>
</div>
<div class="panel-body">
<div class="row">
<div class="col-xs-12">
<form id="login-form" asp-controller="Account" asp-action="Login" method="post" role="form" style="display: block;"
data-ajax="true" data-ajax-method="POST" data-ajax-mode="replace" data-ajax-update="formData" data-ajax-complete="AcctLib.Login.Events.onComplete">
@Html.AntiForgeryToken()
<div class="form-group">
<input type="text" name="UserName" id="UserName" tabindex="1" class="form-control" placeholder="Email Address" value="@Model.UserName">
<span asp-validation-for="UserName" class="text-danger"></span>
</div>
<div class="form-group">
<input type="password" name="Password" id="Password" tabindex="2" class="form-control" placeholder="Password">
<span asp-validation-for="Password" class="text-danger"></span>
</div>
<div class="form-group text-center">
<input type="checkbox" tabindex="3" class="" name="RememberMe" id="RememberMe">
<label for="RememberMe"> Remember Me</label>
</div>
<div class="form-group">
<div class="row">
<div class="col-sm-6 col-sm-offset-3">
<input type="submit" name="login-submit" id="login-submit" tabindex="4" class="form-control btn btn-primary" value="Log In">
</div>
</div>
</div>
<div class="form-group">
<div class="row">
<div class="col-lg-12">
<div class="text-center">
<a id="PasswordReset" asp-controller="Account" asp-action="PasswordReset" data-ajax="true" data-ajax-method="GET" data-ajax-mode="replace" data-ajax-update="#formData" tabindex="5" class="inshora-forgot-password">Forgot Password?</a>
</div>
</div>
</div>
</div>
</form>
</div>
</div>
</div>
<script type="text/javascript">
$(document).ready(function() {
AcctLib.Login.Init();
})
</script>
public class LoginViewModel
{
[Required]
public string UserName { get; set; }
[Required]
public string Password { get; set; }
[Required]
public bool RememberMe { get; set; }
}
AcctLib.Login.RebindForm = function() {
$('form').each(function (i, f) {
$form = $(f);
$form.removeData('validator');
$form.removeData('unobtrusiveValidation');
$.validator.unobtrusive.parse($form);
});
}
AcctLib.Login.Init = function () {
AcctLib.Login.RebindForm();
$('#UserName').focus();
}
<div class="row">
<div class="col-sm-8 col-sm-offset-2">
<div class="panel panel-primary" id="formData">
@await Html.PartialAsync("_UserNamePartial", new UserNameViewModel())
</div>
</div>
</div>
@section Scripts
{
@{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
}
if (!ModelState.IsValid)
return PartialView("..\\Home\\_UserNamePartial", model);
if(!ModelState.IsValid)
return PartialView("../Home/_UserNamePartial", model);
<div class="panel-body">
<div class="row">
<div class="col-xs-12">
<form id="login-form" asp-controller="Account" asp-action="Login" method="post" role="form"
data-ajax="true" data-ajax-method="POST" data-ajax-mode="replace" data-ajax-update="#formData">
@Html.AntiForgeryToken()
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="form-group">
<label asp-for="UserName"></label>
<input asp-for="UserName" class="form-control" placeholder="Email Address"/>
<span asp-validation-for="UserName" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Password"></label>
<input asp-for="Password" class="form-control" placeholder="Password"/>
<span asp-validation-for="Password" class="text-danger"></span>
</div>
<div class="form-group text-center">
<input asp-for="RememberMe" />
<label asp-for="RememberMe"> Remember Me</label>
</div>
<div class="form-group">
<div class="row">
<div class="col-sm-6 col-sm-offset-3">
<input type="submit" name="login-submit" id="login-submit" tabindex="4" class="form-control btn btn-primary" value="Log In">
</div>
</div>
</div>
<div class="form-group">
<div class="row">
<div class="col-lg-12">
<div class="text-center">
<a id="PasswordReset" asp-controller="Account" asp-action="PasswordReset" data-ajax="true" data-ajax-method="GET" data-ajax-mode="replace" data-ajax-update="#formData" tabindex="5" class="inshora-forgot-password">Forgot Password?</a>
</div>
</div>
</div>
</div>
</form>
</div>
</div>
</div>
@{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
@section Scripts
{
}