Обработка недопустимых значений с ModelBinder в ASP.NET MVC 1.0
Прежде всего некоторый контекст:
У меня есть форма, где я отправляю обратно некоторые объекты, которые автоматически материализуются в объекты 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), что мы далее спускаем линейную карту в сущности каркаса сущностей, поэтому нам не хотелось бы ничего менять в DTO, кроме, возможно, добавления атрибутов.
проблема
Если пользователь вводит недопустимое значение для "Часов", скажем, "Fubar", то ModelBinder, естественно, не будет пытаться установить свойство "Часов". Но по умолчанию это 0, потому что это int, а не строка.
Это вызывает некоторые трудности для меня, потому что теперь я не вижу, действительно ли пользователь ввел 0 или это было вызвано неправильным вводом.
Так как я использую сопоставленный объект-сущность (Entity Framework), мы не можем изменить отпечаток свойства 'Hours' на int?, Мне известно, что в MVC есть некоторые встроенные средства проверки, но мы бы не стали реализовывать это, поскольку знаем, что он подвергся дикой атаке, и что в ASP.NET MVC 2.0 появилась новая проверка.
Решение?
Мне нужно иметь возможность указать пользователю, какое поле является неправильным, так что это означает, что я каким-то образом должен быть в состоянии перехватить исключение (или, возможно, какое-то другое гениальное решение?), Где я могу сделать некоторую логику и опубликовать новое посмотреть пользователю, где я уточнить, что они сделали неправильно.
Моя текущая идея: написание собственного ModelBinder.
Что ты предлагаешь?
2 ответа
Это вызывает некоторые трудности для меня, потому что теперь я не вижу, действительно ли пользователь ввел 0 или это было вызвано неправильным вводом.
Да, ты можешь. Посмотрите в ModelState.
Хотя это не особенно идеально, вы заявили, что не хотите ничего менять. Таким образом, вариант, который вы упомянули, создание пользовательского ModelBinder будет работать нормально. Однако вы можете создать ModelBinder для каждой сущности, которую хотите связать.