Я думаю, что принятый ответ - это ленивый и обходной 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
})
Подробнее о модели проверка