ASP.Net MVC Core ValidationSummary всегда показывает ошибки частичного представления

У нас есть основная форма с некоторыми основными входными данными и частичным представлением, отображаемым в модальном диалоговом окне Boostrap:

@model CreateDonutVm
@{
    ViewData["Title"] = "Create Donut";
}

<div id = "homer-search-modal" class = "modal" role = "dialog">
    <div class = "modal-dialog modal-lg">
        <div class = "modal-content" id = "homerSearchModalContent">
            @await Html.PartialAsync("_SearchHomer.cshtml", Model.HomerSearch)
        </div>
    </div>
</div>

<form asp-controller = "Donuts" asp-action = "Create">
    <fieldset class = "with-legend">
        <legend>Donut Details</legend>
        <div class = "form-row align-items-center">
            @Html.LabelFor(m => m.Donut.BoughtBy, "", new {@class = "col-sm-1 col-form-label-sm"})
            <div class = "col-sm-2">
                @Html.TextBoxFor(m => m.Donut.BoughtBy, "", new {@class = "form-control form-control-sm"})
            </div>
        </div>
    </fieldset>
    <div class = "clearfix">
        @if (!ViewData.ModelState.IsValid)
        {
            <div class = "alert alert-danger" role = "alert">
                @Html.ValidationSummary(false, "Donut Creation failed. Please correct these errors:")
            </div>
        }
        <button type = "submit" class = "btn btn-primary float-right">Save</button>
    </div>
</form>

Модели:

public class CreateDonutVm
{
    public CreateDonutVm()
    {
        HomerSearch = new HomerSearchVm();
    }

    public HomerSearchVm HomerSearch { get; set; }
    public DonutDto Donut { get; set; }
}

public class DonutDto
{
    [Required]
    public string BoughtBy { get; set; }
}

public class HomerSearchVm
{
    [Required]
    public string SearchTerm { get; set; }
}

Как видите, для частичного представления требуется собственная модель, содержащая условие поиска, которое пользователь вводит, а затем отправляет обратно в контроллер для поиска списка сущностей. В частичном представлении пользователь выбирает желаемый объект. Затем идентификатор объекта и имя возвращаются в форму на главной странице.

Когда пользователь нажимает кнопку «Сохранить» в основной форме, мы не хотим, чтобы отображались сообщения проверки из частичного представления (эти ошибки обрабатываются в модальной форме).

Я искал повсюду, но не могу найти пример того, как кто-то достиг этого.

Первоначально я предполагал, что, поскольку частичное представление отображается вне формы, содержащей элемент управления ValidationSummary, MVC не будет оценивать состояние элементов управления в частичных элементах.

Однако, просматривая ModelState после отправки основной формы, MVC оценивает элементы управления частичным представлением и помещает ошибки в коллекцию ModelState.Errors для этих элементов управления частичным представлением.

Есть ли способ заставить MVC оценивать элементы управления только в основной форме и игнорировать элементы управления в частичных представлениях?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
511
2

Ответы 2

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

Но когда вы отправляете форму и передаете Model, тогда модель должна быть действительной... при условии, что HomerSearch имеет обязательное поле, которое не было заполнено, ваш Model недействителен и, следовательно, не должен быть отправлен... если HomeSearch не внутри формы, тогда он не будет включен в вашу модель... но тогда, если ваш Model требует некоторого значения от HomeSearch, вы получите ошибку проверки...

Похоже, вам нужно реорганизовать свой дизайн... вы можете:

  • не передавайте всю модель контроллеру, просто передайте Donut
  • удалить HomerSearch проверки...
  • использовать пользовательские/условные правила проверки

Дело не в том, что в теге form; важно, что в вашей модели. Когда вы отправляете, ни одно из значений для HomerSearch не будет опубликовано, потому что они не в той форме, которая публикуется, но, они все еще являются частью вашей модели, и если в ней есть обязательные поля, то ваша модель будет провал проверки в результате.

Тем не менее, свойства ссылочных свойств, таких как ваша опора HomeSearch, проверяются только в том случае, если эталонная опора не равна нулю. Этот должен будет значением по умолчанию, но вполне вероятно, что вы обновляете его в конструкторе модели представления или используете значение по умолчанию в свойстве. Просто вы должны остановить это, если вы не хотите, чтобы он участвовал в проверке. Однако это может быть невозможно на основе остальной части вашего кода. Если что-то еще зависит от этого, установленного для экземпляра, вы сломаете этот код.

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

Частичное представление содержит разметку для элемента управления поиском в другой форме, где пользователь вводит поисковую фразу в текстовое поле, нажимает «Поиск», отображается сетка объектов, а затем выбирает объект. Затем идентификатор и имя выбранного объекта возвращаются в форму на главной странице. Поэтому мне кажется, что компонент представления здесь не подходит, потому что нам нужно, чтобы частичное представление имело модель, к которой мы можем привязать поисковую фразу и набор результатов сущности. Есть ли у вас какие-либо другие предложения о том, как подойти к проблеме?

JTech 20.03.2019 00:20

Другие вопросы по теме