У меня есть контроллер с двумя действиями:
[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);
}
Как вы видите, когда форма публикует свои данные, действие Add использует 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, поскольку пользователь ввел строку, а не целое число.
Поскольку действие Add возвращает представление и передает модель (возвращает View (gig);), если состояние модели недопустимо, когда форма повторно отображается с сообщениями проверки, значение «TEST» не отображается в текстовом поле , Вместо этого это будет значение по умолчанию gig.StartDate.Hour.
Как мне обойти эту проблему? Я действительно застрял!