Я написал класс, который реализует IModelBinder
(см. Ниже). Этот класс обрабатывает форму, которая имеет 3 входа, каждый из которых представляет части значения даты (день, месяц, год). Я также написал соответствующий метод расширения HtmlHelper
для печати трех полей в форме.
Если для входных данных дня, месяца и года заданы значения, которые можно проанализировать, но отдельное значение не проходит проверку, все в порядке - поля заполняются заново, и страница предоставляется пользователю, как и ожидалось.
Однако, когда указаны недопустимые значения и невозможно проанализировать DateTime
, я возвращаю произвольное DateTime
, чтобы поля были заполнены при возврате пользователю.
Я читал о похожих проблемах, с которыми сталкивались люди, и все они, казалось, были из-за отсутствия звонка SetModelValue()
. Я этого не делал, но даже после добавления проблема не решилась.
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
string modelName = bindingContext.ModelName;
string monthKey = modelName + ".Month";
string dayKey = modelName + ".Day";
string yearKey = modelName + ".Year";
//get values submitted on form
string year = bindingContext.ValueProvider[yearKey].AttemptedValue;
string month = bindingContext.ValueProvider[monthKey].AttemptedValue;
string day = bindingContext.ValueProvider[dayKey].AttemptedValue;
DateTime parsedDate;
if (DateTime.TryParse(string.Format(DateFormat, year, month, day), out parsedDate))
return parsedDate;
//could not parse date time report error, return current date
bindingContext.ModelState.AddModelError(yearKey, ValidationErrorMessages.DateInvalid);
//added this after reading similar problems, does not fix!
bindingContext.ModelState.SetModelValue(yearKey, bindingContext.ValueProvider[modelName]);
return DateTime.Today;
}
Исключение нулевой ссылки выдается, когда я пытаюсь создать текстовое поле для свойства Год даты, но, как ни странно, не для Дня или Месяца!
Кто-нибудь может объяснить, почему это так?