C# ASP.NET Core 2.1不引人注目的Ajax验证不适用于部分视图表单交换

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提交,我将在响应中返回带有新表单的登录或注册部分视图。当提交不完整的表单并返回相同的部分视图时,第二个表单将不会显示模型验证错误 提前感谢您为结束这种疯狂行为提供的任何提示 父视图部分 登录部分视图(验证错误显示不工作) 客

我花了几个小时梳理了Stackoverflow和其他网站,尝试了所有人的解决方案,但到目前为止运气都不好。我肯定我错过了什么,但我看不到。希望你能给我指出一个解决办法

我在局部视图中有一个初始表单,它被渲染成一个父视图,父视图的验证工作正常。一旦表单通过ajaxreplace提交,我将在响应中返回带有新表单的登录或注册部分视图。当提交不完整的表单并返回相同的部分视图时,第二个表单将不会显示模型验证错误

提前感谢您为结束这种疯狂行为提供的任何提示

父视图部分 登录部分视图(验证错误显示不工作) 客户端初始化代码 更新 我已经将父页面(index.cshtml)更新为以下内容,但它仍然没有显示消息

<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
{

}