Обработка недопустимых значений с ModelBinder в ASP.NET MVC 1.0 - PullRequest
1 голос
/ 25 января 2010

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

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

<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 , а не string .

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

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

Решение

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

Моя текущая идея: написание собственного ModelBinder.

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

Ответы [ 2 ]

0 голосов
/ 25 января 2010

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

0 голосов
/ 25 января 2010

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

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

...