Удаленная проверка при вводе файла в .NET Core MVC - PullRequest
0 голосов
/ 11 февраля 2019

Я реализовал удаленную проверку для свойства текста без проблем, и удаленная проверка запускается корректно, однако я пытаюсь также добавить проверку для загрузки изображения перед отправкой формы.В идеале я хотел бы, чтобы файл проверялся удаленно после выбора локального файла.Есть ли способ заставить это работать?Я не вижу, какое событие на самом деле запускает удаленную проверку, но я предполагаю, что это то, что не запускается в элементе ввода для файла.Какие-либо предложения?Спасибо

Пробовали следующее:

ViewModel:

[Remote(action: "ValidatePhoto", controller: "Photos", ErrorMessage = "Photo width and height must be at least 300 pixels")]
public IFormFile Photo { get; set; }

PhotosController:

public IActionResult ValidatePhoto(IFormFile Photo)
{
    if (Validation.MeetsMinimumImageDimensions(Photo))
    {
        return Json(true);
    }
    return Json(false);
}

Просмотр:

<input id="photoUpload" asp-for="Photo" type="file" accept="image/*" name="Photo" style="display:none" />
<span id="submitError" asp-validation-for="Photo" class="text-danger"></span>

1 Ответ

0 голосов
/ 11 февраля 2019

Для встроенного Remote valition будет Get или Post методов для отправки запроса с содержимым в полях.Он не будет передавать объект файла с данными формы.

Попробуйте добавить собственный ajax-запрос к внутреннему методу.как показано ниже:

    @section Scripts {
        @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}

        <script type="text/javascript">
            $(document).ready(function () {
                document.querySelector("form input[type=file]").onchange = function (event) {
                    var path = $(this).attr("data-val-remote-url");
                    var field = $(this).attr("id");
                    var errormsg = $(this).attr("data-val-remote");
                    var formdata = new FormData();
                    var file = document.getElementById(field).files[0];
                    formdata.append(field, file)
                    $.ajax({
                        url: path,
                        type: 'POST',
                        data: formdata,
                        processData: false,
                        contentType: false,
                        success: function (data) {
                            if (data == false) {
                                var msg = $("[data-valmsg-for=" + field + "]").first();
                                msg.html(errormsg)
                            }
                        }
                    });
                    return false;
                };
            });
        </script>
    }

С помощью этого метода он отправит два запроса к действию с методом Get для встроенной проверки и методом Post для нашего пользовательского запроса, попробуйте изменить метод проверки как

    public IActionResult ValidatePhoto(IFormFile Photo)
    {
        if (Request.Method == HttpMethods.Get)
        {
            return Json(true);
        }
        if (Validation.MeetsMinimumImageDimensions(Photo))
        {
            return Json(true);
        }
        return Json(false);
    }
...