Подтвердить что ты не робот

ASP.NET MVC: ModelState vs. ModelStateDictionary

У меня есть служба, которая имеет метод, вызываемый при запуске определенного метода контроллера.

Моя служба возвращает пользовательский объект результатов PlacementResult, в котором я хочу передать ошибки, которые могут произойти (проверка) обратно к методу контроллера.

Должны ли PlacementResult иметь ModelState или ModelStateDictionary для передачи ошибок обратно контроллеру (и, наконец, просмотр)? Как бы связать это вместе?

Наконец, как мне получить ModelState/ModelStateDictionary (в зависимости от того, что вы мне скажете, я должен выбрать) обратно в представление (выделение соответствующего текстового поля, отображение сообщения об ошибке и т.д.)?

Спасибо!

4b9b3361

Ответ 1

Это хорошая ссылка, которая показывает, как служба может выполнить проверку и передать результат обратно контроллеру:

http://www.asp.net/mvc/tutorials/validating-with-a-service-layer-cs (фиксированная ссылка)

Ответ 2

Нет, вы не хотите добавлять ModelStateDictionary к типу результата. На контроллере уже есть ModelStateDictionary (в свойстве ModelState). Невозможно установить результаты для состояния модели контроллера. Это должно быть сделано во время привязки или в самом действии контроллера. Если вам нужно, используйте настраиваемое связующее устройство.

Вы можете выбрать ошибки состояния модели, просмотрев свойство контроллера ViewData.ModelState.

Ответ 3

Ваше PlacementResult должно вернуть объект словаря или список, который вы должны объединить с состоянием модели в начале каждого действия.

Если вы пройдете, вы заметите, что словарь состояния модели контроллера содержит все ваши поля ввода, их значения и связанные с ними ошибки. Вы хотите объединить ошибки PlacementResult в словарь состояния модели с соответствующими ключами. Вот как движок просмотра знает, какие поля должны быть отмечены как недопустимые.

ModelState.Merge(PlacementResult);
if(ModelState.IsValid)
{
    ...
}

Ответ 4

Я не знаю, как выглядит ваш PlacementResult, посмотрите, можете ли вы использовать это в своем представлении:

ModelState.AddModelError(ErroredProperty, ErrorMessage);

Убедитесь, что вы вернули объект, который не вернулся к представлению

return View(myObjectInstance);

Ответ 5

Основываясь на SoC, я думаю, что вам нужно вернуть ошибки из своих сервисов и объединить их в ModelState, если это необходимо.

Но наша цель - поддерживать развязку, а также использовать метод ModelState.Merge(). это не?

Существует конкретная реализация которая могла бы помочь

Ответ 6

Вы можете передать контроллер в свой метод, поскольку класс Controller содержит свойство ModelState. В вашем методе вы можете сделать следующее:

private PlacementResult BuildResult(Controller controller)
{
   controller.ModelState.AddModelError(propertyName, errorMessage);
}

В вашем действии...

BuildResult(this);
if(ModelState.IsValid) {...