Удаленная проверка ASP.NET Core MVC не попадает в контроллер - PullRequest
0 голосов
/ 31 октября 2019

Я использую удаленную проверку ядра в форме внутри частичного представления, которая загружается в главном представлении, но я продолжаю получать сообщение об ошибке в консоли браузера при попытке выполнить проверку ([имя_элемента] - это имя поляпроверяется):

Uncaught TypeError: Невозможно прочитать свойство 'call' из undefined. Возникла исключительная ситуация при проверке элемента [имя_элемента] , проверьте метод __dummy__.
в a.validator.check (VM23 jquery.validate.min.js: 4)
в a.validator.element (VM23 jquery.validate.min.js: 4)
в a.validator.onfocusout (VM23 jquery.validate.min.js: 4)
в HTMLTextAreaElement.b (VM23 jquery.validate.min. js: 4)
в HTMLFormElement.dispatch (jquery.min.js: 2)
в HTMLFormElement.v.handle (jquery.min.js: 2)
в Object.trigger (jquery.min. js: 2)
в Object.simulate (jquery.min.js: 2)
в HTMLDocument.i (jquery.min.js: 2)


Итак, яиметь представление, которое после нажатия кнопки загружает частичное представление, которое содержит заполненную форму (для выполнения действий по обновлению) в этом <div>:

<div class="modal fade" id="modalPlaceholder" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="false"></div>

с этим кодом jQuery:

function requestUpdate(idSolicitacao) {
    $('#modalPlaceholder').empty();
    $.ajax({
        type: 'POST',
        url: 'Solicitacao/GetUpdate/' + idSolicitacao,
        success: function (result) {
            $('#modalPlaceholder').html(result);
        }
    });     
    $('#modalPlaceholder').modal('show');
}

В форме частичного просмотра я использую удаленную проверку для подтверждения изменений, которые делает пользователь. Я включил сюда сценарии jquery-validate, потому что он не работал, когда я импортировал его только в файл _Layout.cshtml. Весь файл выглядит так:

@model Potinho.ViewModels.SolicitacaoVM.Update
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
<div class="modal-dialog" role="document">
    <div class="modal-content">
        <div class="modal-header">
            <button type="button" class="close" data-dismiss="modal" aria-label="Fechar">
                <span aria-hidden="true">&times;</span>
            </button>
            <h4 class="modal-title"><strong>Solicitação</strong></h4>
        </div>
        <div class="container-fluid" style="margin:10px">
            <div class="row">
                <div class="col">
                    <form asp-controller="Solicitacao" asp-action="Update" method="post">
                        <div class="form-group">
                            <input asp-for="@Model.IdSolicitacao" hidden />
                            <input asp-for="@Model.IdPote" hidden />
                            <input asp-for="@Model.IdSolicitante" hidden />
                            <input asp-for="@Model.IdFavorecido" hidden />
                            <input asp-for="@Model.IdItem" hidden />
                            <input asp-for="@Model.IdStatus" hidden />
                            <div class="mb-2">
                                <label asp-for="@Model.Descricao" class="control-label"></label>
                                <textarea asp-for="@Model.Descricao" class="form-control"> </textarea>
                                <span asp-validation-for="@Model.Descricao" class="text-danger"></span>
                            </div>
                            <div class="mb-2">
                                <label asp-for="@Model.Local" class="control-label"></label>
                                <input asp-for="@Model.Local" class="form-control" />
                                <span asp-validation-for="@Model.Local" class="text-danger"></span>
                            </div>
                            <div class="mb-2">
                                <label asp-for="@Model.Valor" class="control-label"></label>
                                <input asp-for="@Model.Valor" class="form-control" />
                                <span asp-validation-for="@Model.Valor" class="text-danger"></span>
                            </div>
                            <div class="mb-2">
                                <label asp-for="@Model.DataInicio" class="control-label"></label>
                                <input asp-for="@Model.DataInicio" class="form-control" type="date" />
                                <span asp-validation-for="@Model.DataInicio" class="text-danger"></span>
                            </div>
                            <div class="mb-2">
                                <label asp-for="@Model.DataFim" class="control-label"></label>
                                <input asp-for="@Model.DataFim" class="form-control" type="date" />
                                <span asp-validation-for="@Model.DataFim" class="text-danger"></span>
                            </div>
                        </div>
                        <div class="form-group">
                            <input type="submit" value="Salvar" class="btn btn-success" />
                            <button type="button" class="btn btn-secondary" data-dismiss="modal">Cancelar</button>
                        </div>
                    </form>
                </div>
            </div>
        </div>
    </div>
</div>
<div>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.19.1/jquery.validate.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validation-unobtrusive/3.2.11/jquery.validate.unobtrusive.min.js"></script>
</div>

Соответствующая часть ViewModel выглядит так:

public class Update
{
    [BindProperty]
    [Remote(action: "IsDescricaoValid", controller: "Solicitacao")]
    [Display(Name = "Descrição")]
    public string Descricao { get; set; }

    [BindProperty]
    [Remote(action: "IsLocalValid", controller: "Solicitacao")]
    public string Local { get; set; }

    [BindProperty]
    [Remote(action: "IsValorValid", controller: "Solicitacao")]
    public decimal Valor { get; set; }

    [BindProperty]
    [Remote(action: "IsDataInicioValid", controller: "Solicitacao")]
    [Display(Name = "Data de início")]
    public DateTime DataInicio { get; set; }

    [BindProperty]
    [Remote(action: "IsDataFimValid", controller: "Solicitacao")]
    [Display(Name = "Data final")]
    public DateTime DataFim { get; set; }

    [Required]
    [BindProperty]
    public DateTime DataSolicitacao { get; set; }

    [Key]
    [Required]
    [BindProperty]
    public Guid IdSolicitacao { get; set; }

    [Required]
    [BindProperty]
    public Guid IdPote { get; set; }

    [Required]
    [BindProperty]
    public string IdSolicitante { get; set; }

    [Required]
    [BindProperty]
    public string IdFavorecido { get; set; }

    [Required]
    [BindProperty]
    public Guid IdItem { get; set; }

    [Required]
    [BindProperty]
    public Guid IdStatus { get; set; }
}

И методы удаленной проверки в контроллере:

[AcceptVerbs("Get", "Post")]
[AllowAnonymous]
public IActionResult IsDescricaoValid(string descricao)
{
    return _validator.IsDescricaoValid(descricao);
}

[AcceptVerbs("Get", "Post")]
[AllowAnonymous]
public IActionResult IsLocalValid(string local)
{
    return _validator.IsLocalValid(local);
}

[AcceptVerbs("Get", "Post")]
[AllowAnonymous]
public IActionResult IsValorValid(decimal valor)
{
    return _validator.IsValorValid(valor);
}

[AcceptVerbs("Get", "Post")]
[AllowAnonymous]
public IActionResult IsDataInicioValid(DateTime dataInicio)
{
    return _validator.IsDataInicioValid(dataInicio);
}

[AcceptVerbs("Get", "Post")]
[AllowAnonymous]
public IActionResult IsDataFimValid(DateTime dataFim)
{
    return _validator.IsDataFimValid(dataFim);
}

Из того, что я тестировал, <div> загружается с частичным представлением, и сценарии импортируются, но каждое поле вызывает ту же ошибку, и точки останова, которые я установил в контроллере, даже не достигаются.

1 Ответ

0 голосов
/ 31 октября 2019

Решил это. Я использовал устаревший (или некорректный) jquery-validate импорт. Чтобы решить эту проблему, я заменил строку

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.19.1/jquery.validate.min.js"></script>

на

<script src="https://cdn.jsdelivr.net/npm/jquery-validation@1.19.1/dist/jquery.validate.js"></script>

в файле _UpdateSolicitacao.cshtml.

...