ASP.Net MVC Core ValidationSummary всегда показывает частичные ошибки просмотра - PullRequest
1 голос
/ 19 марта 2019

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

@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 оценивать элементы управления только в основной форме и игнорировать их в частичных представлениях?

Ответы [ 2 ]

1 голос
/ 19 марта 2019

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

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

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

0 голосов
/ 19 марта 2019

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

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

Звучит так, как будто вам нужно реорганизовать свой дизайн ... вы можете:

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