Условно разрешить нажмите кнопку Отправить - PullRequest
0 голосов
/ 13 июня 2018

В форме у меня есть поле, которое должно взять имя файла (после просмотра файла), и кнопку отправки.После нажатия кнопки отправки файл должен загрузиться на сервер.И работает нормально.Но если я не выбрал какой-либо файл (например, поле пусто) - щелчок вызывает исключение, потому что ничего не загружается.

И да, привет от новичка в mvc и веб-технологии.

Какпредотвратить такое поведение?Например, как сделать какое-нибудь всплывающее сообщение после нажатия кнопки sumbit, чтобы «вход пуст»?

<form asp-action="Upload" asp-controller="Home" method="post" enctype="multipart/form-data">
<div class="row">
    <div class="col-sm-7">
            <label for="file">Xml file</label>
            <div data-width="85%" class="input-group">
                <label class="input-group-btn">
                    <span class="btn btn-primary">
                        <input id="file" name="Files" type="file" accept=".xml" style="display: none;">Browse&hellip;
                    </span>
                </label>
                <input type="text" class="form-control" readonly>
            </div>
        </div>
        <div class="col-sm-1"></div>
        <div class="col-sm-4" style="margin-top:15px;">
            <input type="submit" class="btn btn-primary btn-block" value="Upload" />
        </div>       
</div>

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Я думаю, что принятый ответ - это ленивый и обходной JavaScript, и он станет утомительным, как только у вас будет более 1 поля ввода.

Вам нужна Модель, которая представляет собой ваши данные, собранные из представления, а затем манипулирующие внутри контроллера, в вашем случае это файл.

Таким образом, ваша Модель должна выглядеть примерно так:

public class MyModelName {
     [Required(ErrorMessage = "Display a custom error message when the field is not filled out, leave this option out for default error message")]
     public IFormFile MyFileName { get; set; } 
}

Чтобы иметь возможность использовать MyModelName внутри представления (назовем его MyView и оно получает и отправляет действие MyView внутри контроллера), вы должны сделать представление осведомленным оЭто.Это делается включением @model MyModelName в верхней части файла View (с учетом регистра).Когда представление узнает о модели, для ссылки на нее используйте @Model, и это вызовет объект.

Теперь для вашей формы вместо ручного добавления атрибутов, таких как name и type кв поле ввода используются помощники asp.

Вместо:

<input id="file" name="Files" type="file" accept=".xml" style="display: none;">

Пишите так:

<input id="file" asp-for="@Model.MyFileName">

Посмотрите, что сгенерировано с помощью инструментов разработчика Browser, вы увидите все виды атрибутов, автоматически добавленных в поле ввода.

В любом месте страницы добавьте пробел для сообщения проверки (обычно под полем ввода)):

<span asp-validation-for="@Model.MyFileName"></span>

На этом этапе у вас есть проверка на стороне сервера, которую вы можете использовать, вызывая ModelState.IsValid следующим образом:

[HttpPost]
public IActionResult MyView(MyModelName model){
    if(ModelState.IsValid)
         //proceed to do whatever with the file
    return View(model); //return the model with the validation errors
}

Итак, проверка на стороне сервераозначает, что перед тем, как вы увидите сообщения об ошибках в браузере, но сайт должен совершить обратное путешествие в серверную часть.

Для проверки без необходимости поездки на сервер вы включаете частичную проверкускрипты внутри представления, этопредоставляется стандартными шаблонами Microsoft.Внизу MyView.cshtml include (для этого вам понадобится библиотека jquery по умолчанию):

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

После того, как вы перейдете на этот этап, у вас будет проверка на стороне клиента, и форма не будет отправлена, если не всетребования к валидации были выполнены.

Если вы дополнительно захотите манипулировать валидацией, скрипты валидации, добавленные вами в частичную, предоставляют функцию valid()

, которую можно использовать следующим образом:

$('form').on('submit', function(e){
    //stop the form from being submitted
    e.preventDefault();

    if($(this).valid()) {
        //do stuff if form is valid
    }
    //do stuff if form is not valid
})

Подробнее о модели проверка

0 голосов
/ 13 июня 2018

Я бы решил это, используя javascript и аннотации данных, что-то вроде (используйте в качестве ориентации):

$(input).click(function(event)
{
    ...
    if($(input).files.length == 0){
        $(input).addClass("disabled");
        event.preventDefault();
    }
    ...
});

Также используйте DataAnnotations в вашей модели представления.Если вы используете атрибут [Required], вы не сможете отправить форму без файла, например.

Посмотрите на https://docs.microsoft.com/en-us/aspnet/mvc/overview/getting-started/introduction/adding-validation

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...