У меня есть контроллер с двумя действиями:
[AcceptVerbs("GET")]
public ActionResult Add()
{
PrepareViewDataForAddAction();
return View();
}
[AcceptVerbs("POST")]
public ActionResult Add([GigBinderAttribute]Gig gig, FormCollection formCollection)
{
if (ViewData.ModelState.IsValid)
{
GigManager.Save(gig);
return RedirectToAction("Index", gig.ID);
}
PrepareViewDataForAddAction();
return View(gig);
}
Как видите, когда форма публикует свои данные, действие «Добавить» использует GigBinder (реализация IModelBinder).
В этом переплете у меня есть:
if (int.TryParse(bindingContext.HttpContext.Request.Form["StartDate.Hour"], out hour))
{
gig.StartDate.Hour = hour;
}
else
{
bindingContext.ModelState.AddModelError("Doors", "You need to tell us when the doors open");
}
Форма содержит текстовое поле с идентификатором "StartDate.Hour".
Как вы можете видеть выше, GigBinder проверяет, что пользователь ввел целое число в текстовое поле с идентификатором «StartDate.Hour». Если нет, ошибка модели добавляется в состояние модели с помощью AddModelError.
Поскольку свойство gigs gigs.StartDate.Hour строго типизировано, я не могу установить для него значение, например, «TEST», если пользователь ввел это в текстовое поле формы.
Следовательно, я не могу установить значение gigs.StartDate.Hour, поскольку пользователь ввел строку, а не целое число.
Поскольку действие «Добавить» возвращает представление и передает модель (return View(gig);), если состояние модели недопустимо, когда форма повторно отображается с сообщениями проверки, значение «ТЕСТ» не отображается в текстовом поле. Вместо этого будет значение по умолчанию gig.StartDate.Hour.
Как мне обойти эту проблему? Я действительно застрял!