2010-01-25 2 views
1

Прежде всего некоторого контекста:Обработка недопустимых значений с ModelBinder в ASP.NET MVC 1,0

У меня есть форма, где я отправляю назад некоторые объекты, которые автоматически материализованные в объекты по MVCS встроенным 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, естественно, не будет пытаться установить «Hours'-свойством. Но по умолчанию он равен 0, потому что это int, а не строка.

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

Поскольку я использую самонастраиваемую карту объекта-объекта (Entity Framework), мы не можем изменить отпечаток стопы свойства «Часы» до int?. Я знаю, что MVC имеет встроенную функцию Validation, но мы предпочли бы не реализовывать ее, так как мы знаем, что она была атакованной и что в ASP.NET MVC 2.0 есть несколько новых утверждений.

Решение?

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

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

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

ответ

0

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

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

0

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

+0

да, я не собираюсь этого делать;) .. но спасибо за вход – CodeMonkey