Обработка недопустимых значений с помощью ModelBinder в ASP.NET MVC 1.0

StackOverflow https://stackoverflow.com/questions/2134100

Вопрос

Прежде всего, некоторый контекст:

У меня есть форма, где я отправляю обратно некоторые объекты, которые автоматически материализуются в объекты встроенным в MVC ModelBinder:

<input type="hidden" name="myobj[0].Id" />
<input type="text" name="myobj[0].Hours" />
<input type="hidden" name="myobj[1].Id" />
<input type="text" name="myobj[1].Hours" />

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Save(IList<MyObject> myobj);

Дополнительно:Я хотел бы подчеркнуть, что мы публикуем в DTO (DataTransferObjects), что мы далее по строке сопоставляем объекты entity framework, поэтому нам бы не хотелось ничего менять в DTO, за исключением, возможно, добавления атрибутов.

Проблема

Если пользователь вводит недопустимое значение для "Часов", скажем 'Fubar', то ModelBinder, естественно, не будет пытаться установить свойство 'Hours'.Но по умолчанию оно равно 0, потому что это инт и не один строка.

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

Поскольку я использую преобразователь "объект-сущность" с домашним развертыванием (Entity Framework), мы не можем изменить footprint свойства 'Hours' на инт?.Я знаю, что MVC имеет некоторые встроенные проверки, но мы не хотели бы реализовать это, поскольку мы знаем, что это было дико напал и что есть какая-то новая проверка поступающих в ASP.NET в MVC 2.0.

Решение?

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

Моя нынешняя идея:Написание пользовательского ModelBinder.

Что вы предлагаете?

Это было полезно?

Решение

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

Да, ты можешь.Посмотрите в ModelState.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top