Ошибки валидатора MVC исчезают к тому времени, когда контроль отдается контроллеру - PullRequest
3 голосов
/ 27 апреля 2010

У меня есть простая модель FilesModel для обновления строки Description и логическое значение флажка Archived для нескольких (уже загруженных) файлов, а FilesModel имеет валидатор FilesModelValidator, который запускается когда эти данные будут опубликованы. Этот валидатор не делает ничего, кроме проверки того, что у каждого файла есть описание. Я знаю, что он работает и правильно возвращает ошибку для пустых описаний, основанную на моей отладке.

Тем не менее, когда управление передается методу Action в Controller, ModelState отличается от того, что я ожидаю. В полях описания нет ошибок, но для каждого флажка отмечена одна ошибка: «Значение« on »недопустимо для Archived».

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

Validator

public FilesModelValidator()
{
    RuleFor(f => f.Files)
        .Must(AllHaveADescription).WithMessage("Must have a description");
}

public static bool AllHaveADescription(Files files)
{
    // This is run on postback, and returns false when any Description is empty
    return files.All(f => f.Description != null && f.Description.Length > 0);
}

Контроллер

[HttpPost]
public virtual ActionResult Update(FilesModel model)
{
    // At this point, ModelState contains an error for each checked checkbox
    // and no errors for empty descriptions
    if (ModelState.IsValid)
    {
        // Save
    }
    return View(model);
}

Ответы [ 3 ]

8 голосов
/ 29 апреля 2010

Оказывается, эта штука с галочкой была всей проблемой. Я нашел решение этой проблемы в другом месте нашего кода, поэтому я использовал его. Вроде как хак, но работает.

Идея состоит в том, что вам нужно убедиться, что значение флажка равно true, а не "включено". Так что сделайте это:

<input type="checkbox" id="myCheckbox" value="true" />

Затем добавьте скрытый ввод с тем же идентификатором со значением, равным false, сразу после флажка:

<input type="hidden" id="myCheckbox" value="false" />

Если флажок не установлен, значение флажка не отправляется обратно на сервер. Поэтому, когда происходит обратная передача, сервер видит myCheckbox=false, и это именно то, что мы хотели бы в этом случае. Когда флажок установлен на , оба значения ввода публикуются на сервере. Но сервер использует только первое значение (которое является значением самого флажка, поскольку мы помещаем его перед скрытым полем). Итак, сервер видит myCheckbox=true.

3 голосов
/ 11 января 2011

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

Html.CheckBox("FieldName")
0 голосов
/ 28 апреля 2010

У меня была та же проблема с элементами в выпадающем меню, которые были связаны с Enum. Я убрал значение по умолчанию, поэтому, когда кто-то что-то не выбрал, я получил ошибку.

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

Это может быть сделано двумя способами: изменить ваше представление на True / False или, и это то, что я сделал, написать собственный ModelBinder, который выполняет преобразование из Yes в True.

Надеюсь, это поможет вам.

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