Я пытаюсь добавить некоторую проверку формы в несколько моих полей. У меня есть раскрывающийся список и поле ввода. Оба входа нуждаются в проверке. Моя цель - отобразить пользователю сообщение об ошибке, если одно из них недействительно. Форма позволяет пользователю создать копию существующей книги с новым автором. В раскрывающемся списке есть список книг из базы данных, и пользователь вводит имя нового автора в текстовое поле. Кнопка отправки создает копию существующей книги с новым автором.
Используя jQuery, jquery.validate.js и jquery.validate.unobtrusive.js, мне удалось отобразить сообщение об ошибке для пользователя, но проверка происходит сразу после загрузки страницы, поэтому сообщения об ошибках появляются, как только загрузка страницы. (Возможно, мне понадобится скрытое поле или мне придется изменить обработчик HttpGet).
Прямо сейчас, если пользователь попытается отправить форму, не выбрав книгу и/или не введя имя автора, маршрут останется прежним, но форма исчезнет, и на экране появится объект json со статусом 400 и он говорит: «Обязательно поле bookName» и «Обязательно поле автора». Мне просто нужен красный текст рядом с полями ввода, который говорит, что их нельзя оставлять пустыми, как я могу это сделать? Спасибо!
Моя модель:
public int ID { get; set; }
[Required]
public string bookName { get; set; }
[Required]
public string Author { get; set; }
Мой cshtml:
<form method="post" asp-controller="Index" asp-action="Index" role="post">
<div class="form-group">
<label asp-for="bookName"></label>
<select name="bookName" asp-items="@(new SelectList(ViewBag.message, "ID", "bookName"))">
</select>
<span asp-validation-for="bookName">Please select a book.</span>
</div>
<div class="form-group">
<label asp-for="Author"></label>
<input asp-for="Author" class="form-control" />
<span asp-validation-for="Author">Please type in the author's name.</span>
</div>
<div class="form-group">
<input type="submit" value="Submit" class="btn btn-primary" />
</div>
</form>
Мой контроллер:
[HttpGet("[action]")]
[Route("/Index")]
[Produces("application/json")]
public IActionResult Index()
{
return View();
}
[HttpPost("[action]")]
[Route("/Index")]
[Produces("application/json")]
public async Task<IActionResult> Index([FromForm] bookModel model)
{
if(ModelState.IsValid)
{
//do stuff
return View(model)
}
else
{
//display an error message & remain on same page
}
}
Атрибут [Produces("application/json")]не нужен, если ожидается, что ваш контроллер вернет html из представления. Поэтому этот атрибут следует удалить.
Также ваша проверка spanдолжна иметь атрибут , который у asp-validation-forвас есть, as-validation-forкоторый не будет правильно связывать сценарий проверки.
Правильный:
<span asp-validation-for="bookName">Please select a book.</span>
Исправление этого должно привести к тому, что сообщения об ошибках будут отображаться только после того, как элемент управления вводом потерял фокус.
Вы хотите показать сообщение подтверждения при нажатии кнопки? Если да, вы можете изменить сообщение об ошибке в модели и удалить сообщение в своем <span asp-validation-for=xxx></span>Вот демо-версия:
Модель:
public class bookModel
{
public int ID { get; set; }
[Required(ErrorMessage = "Please select a book.")]
public string bookName { get; set; }
[Required(ErrorMessage = "Please type in the author's name.")]
public string Author { get; set; }
}
Контроллер:
public class BookController : Controller
{
public ActionResult Index()
{
ViewBag.message = addMessage();
return View();
}
[HttpPost]
public ActionResult Index(bookModel model) {
ViewBag.message = addMessage();
return View();
}
public static List<SelectListItem> addMessage() {
List<SelectListItem> list = new List<SelectListItem>();
SelectListItem s1 = new SelectListItem { Text = "book1", Value = "b1" };
SelectListItem s2 = new SelectListItem { Text = "book2", Value = "b2" };
SelectListItem s3 = new SelectListItem { Text = "book3", Value = "b3" };
list.Add(s1);
list.Add(s2);
list.Add(s3);
return list;
}
}
Вид:
@{
ViewData["Title"] = "Index";
}
@model bookModel
<h1>Index</h1>
<form method="post">
<div class="form-group">
<label asp-for="bookName"></label>
<select asp-for="bookName" asp-items="@ViewBag.message"></select>
<span asp-validation-for="bookName" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Author"></label>
<input asp-for="Author" class="form-control" />
<span asp-validation-for="Author" class="text-danger"></span>
</div>
<div class="form-group">
<input type="submit" value="Submit" class="btn btn-primary" />
</div>
</form>
Результат:
Яна Дуггар открыто говорила о своих поисках любви. Вот все, что она сказала на эту тему и о своем пятилетнем окне для замужества.
Звезда «Чужестранки» Сэм Хьюэн недавно рассказал, что он возьмет со съемочной площадки, чтобы вспомнить Джейми Фрейзера, роль, которая сделала его звездой.
«She Loves You» была написана за час, записана за день и стала песней The Beatles с одним из лучших исполнений в их карьере.
У Долли Партон и ее бабушки Бесси были особые отношения. Бабушка Партон была очень больна, но это не мешало Долли разыгрывать ее.
Вы можете подумать, что дуб или гикори — прочные породы дерева, но когда речь идет о самой твердой древесине в мире, они даже близко не стоят.
Океан полон красоты, но он также скрывает одних из самых страшных морских существ на планете. Многие из этих животных скрываются глубоко под поверхностью океана, в тёмном, полном давления мире морских глубин.
Если вы сражаетесь с враждебными мобами или готовитесь к PvP-боям, знание лучших чар для мечей в Minecraft может дать вам серьёзное преимущество. Зачарование мечей позволяет наносить больше урона, увеличивать количество выпадающих мобов и продлевать срок службы меча.
Когда говорят о социалистических странах, часто представляют себе полный государственный контроль и отсутствие частной собственности. Но на практике социалистические экономики сильно различаются.
В «Детях» появится громкая камео и несколько разрушительных новостей
Утверждается, что этот RAV4 находится в отличном состоянии и готов к игре в музыкальные стулья.
На кадрах, снятых с дрона, видно, как пожарные изо всех сил пытаются потушить пламя.
«Глаза Ваканды» напрямую связаны с MCU, а также обновления о «Людях Икс '97», «Что, если...», «Сорвиголова» и многом другом.
Ава Гарднер была замужем за Микки Руни и Фрэнком Синтрой, и встречалась с несколькими другими голливудскими звездами. Вот взгляд назад на историю знакомств Авы Гарднер.
Джон Клиз женился на Дженнифер Уэйд в 2012 году. Вот все, что нужно знать о жене Джона Клиза, Дженнифер Уэйд.
Олимпийская чемпионка Эллисон Феликс вышла замуж за своего мужа Кеннета Фергюсона в 2018 году. Вот все, что нужно знать о муже Эллисон Феликс, Кеннете Фергюсоне.
Мена Сувари замужем за своим мужем Майклом Хоупом с 2018 года. Вот все, что нужно знать о муже Мены Сувари.
Это поражает меня Внезапно, как это часто бывает, Это снова и снова на полпути <Нет, не то, что в Тихом океане, ты темно-бордовый, то, что на карнавале> Каждый громкий заголовок…..
В 2022 году, с выпуском GPT-3, навыки письма, кажется, стали менее важными. С помощью ИИ люди с плохим письмом также могут генерировать качественный персонал.
В современном быстро меняющемся и конкурентном мире карьера играет важную роль в личностном росте, финансовой стабильности и общей удовлетворенности жизнью. Однако многие люди оказываются в безжалостном цикле застоя и неудовлетворенности, постепенно угасая в своей профессиональной жизни.
На прошлой неделе я заметил пресс-релиз, разосланный через PressGazette (новостной веб-сайт британских СМИ). В статье сообщалось, что Acast, скандинавская компания по размещению и рекламе подкастов, возглавит консорциум «вероятно, самых влиятельных» издателей подкастинга.