ASP.NET Core 2.1 Ненавязчивая проверка Ajax не работает с частичным обменом форм - PullRequest
0 голосов
/ 15 ноября 2018

Я потратил несколько часов на то, чтобы прочесывать Stackoverflow и другие сайты, пытаясь найти решения для всех, но безуспешно.Я уверен, что что-то пропустил, но я не вижу этого.Надеюсь, вы можете указать мне исправление.

У меня есть начальная форма внутри частичного представления, которое отображается в родительском представлении, проверка которого работает нормально.Как только форма отправлена ​​через Ajax replace, я возвращаю либо частичное представление входа в систему, либо регистрацию с новой формой в ответе.Эта вторая форма не будет отображать ошибки проверки модели при отправке неполной формы и возвращении того же частичного представления.

Заранее благодарим за любые советы, которые вы можете предложить, чтобы положить конец этому безумию!

Родительский раздел просмотра

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

Рабочий визуализированный частичный просмотр

<div class="panel-heading">
<h3 class="panel-title">Let's Start With Your E-mail Address</h3>
</div>
<div class="panel-body">
<div class="row">
    <div class="col-xs-12">
        <form asp-controller="Account" asp-action="IsAccountValid" data-ajax="true" data-ajax-method="POST"
              data-ajax-mode="replace" data-ajax-update="#formData">
            @Html.AntiForgeryToken()
            <div class="form-group">
                <label for="UserName">Your Email Address</label>
                <div class="input-group">
                    <input type="text" id="UserName" name="UserName" class="form-control" placeholder="Your email address" />
                    <div class="input-group-btn">
                        <button type="submit" id="btnGetStarted" class="btn btn-primary">Get Started</button>
                    </div>
                </div>
                <span asp-validation-for="UserName" class="text-danger"></span>
            </div>
        </form>
        <div asp-validation-summary="ModelOnly" class="text-danger"></div>
    </div>
</div>
</div>

Действие контроллера начальной проверки

    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public IActionResult IsAccountValid(UserNameViewModel model)
    {
        if (!ModelState.IsValid)
            return PartialView("../Home/_UserNamePartial", model);

        AccountRepository accountRepository = new AccountRepository(ConnectionConfig.InshoraDev);
        AuthName match = accountRepository.GetAuthName(model.UserName);

        if (match != null)
        {
            ModelState.Clear();
            LoginViewModel loginModel = new LoginViewModel()
            {
                UserName = model.UserName
            };

            return PartialView("_UserLoginPartial", loginModel);
        }

        ModelState.Clear();
        SignUpViewModel signupModel = new SignUpViewModel()
        {
            UserName = model.UserName,
        };

        return PartialView("_UserSignUp", signupModel);
    }

Частичный просмотр входа в систему (отображение ошибки проверки не работает)

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

LoginViewModel

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();
}

Обновление

Я обновил родительскую страницу (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"); }
}

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Проблема заключалась в том, что я не использовал помощники тегов asp-for. Эти помощники отвечают за генерацию атрибутов data- *, необходимых для ненавязчивого анализатора проверки. Как только я начал использовать их, это начало работать. Спасибо всем, кто пытался помочь.

Исправленное изображение

<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>
0 голосов
/ 15 ноября 2018
if (!ModelState.IsValid)
   return PartialView("..\\Home\\_UserNamePartial", model);

уверен, что это нарушает путь

if(!ModelState.IsValid)
   return PartialView("../Home/_UserNamePartial", model);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...