Ответ 1
Это хорошая ссылка, которая показывает, как служба может выполнить проверку и передать результат обратно контроллеру:
http://www.asp.net/mvc/tutorials/validating-with-a-service-layer-cs (фиксированная ссылка)
У меня есть служба, которая имеет метод, вызываемый при запуске определенного метода контроллера.
Моя служба возвращает пользовательский объект результатов PlacementResult, в котором я хочу передать ошибки, которые могут произойти (проверка) обратно к методу контроллера.
Должны ли PlacementResult иметь ModelState или ModelStateDictionary для передачи ошибок обратно контроллеру (и, наконец, просмотр)? Как бы связать это вместе?
Наконец, как мне получить ModelState/ModelStateDictionary (в зависимости от того, что вы мне скажете, я должен выбрать) обратно в представление (выделение соответствующего текстового поля, отображение сообщения об ошибке и т.д.)?
Спасибо!
Это хорошая ссылка, которая показывает, как служба может выполнить проверку и передать результат обратно контроллеру:
http://www.asp.net/mvc/tutorials/validating-with-a-service-layer-cs (фиксированная ссылка)
Нет, вы не хотите добавлять ModelStateDictionary к типу результата. На контроллере уже есть ModelStateDictionary (в свойстве ModelState). Невозможно установить результаты для состояния модели контроллера. Это должно быть сделано во время привязки или в самом действии контроллера. Если вам нужно, используйте настраиваемое связующее устройство.
Вы можете выбрать ошибки состояния модели, просмотрев свойство контроллера ViewData.ModelState.
Ваше PlacementResult должно вернуть объект словаря или список, который вы должны объединить с состоянием модели в начале каждого действия.
Если вы пройдете, вы заметите, что словарь состояния модели контроллера содержит все ваши поля ввода, их значения и связанные с ними ошибки. Вы хотите объединить ошибки PlacementResult в словарь состояния модели с соответствующими ключами. Вот как движок просмотра знает, какие поля должны быть отмечены как недопустимые.
ModelState.Merge(PlacementResult);
if(ModelState.IsValid)
{
...
}
Я не знаю, как выглядит ваш PlacementResult, посмотрите, можете ли вы использовать это в своем представлении:
ModelState.AddModelError(ErroredProperty, ErrorMessage);
Убедитесь, что вы вернули объект, который не вернулся к представлению
return View(myObjectInstance);
Основываясь на SoC, я думаю, что вам нужно вернуть ошибки из своих сервисов и объединить их в ModelState, если это необходимо.
Но наша цель - поддерживать развязку, а также использовать метод ModelState.Merge(). это не?
Существует конкретная реализация которая могла бы помочь
Вы можете передать контроллер в свой метод, поскольку класс Controller содержит свойство ModelState. В вашем методе вы можете сделать следующее:
private PlacementResult BuildResult(Controller controller)
{
controller.ModelState.AddModelError(propertyName, errorMessage);
}
В вашем действии...
BuildResult(this);
if(ModelState.IsValid) {...