ASP.NET MVC: исключение нулевой ссылки с использованием HtmlHelper.TextBox и пользовательского связывателя модели - PullRequest
0 голосов
/ 17 июня 2010

Я написал класс, который реализует 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;
}

Исключение нулевой ссылки выдается, когда я пытаюсь создать текстовое поле для свойства Год даты, но, как ни странно, не для Дня или Месяца!

Кто-нибудь может объяснить, почему это так?

1 Ответ

0 голосов
/ 17 июня 2010

Это должно исправить:

bindingContext.ModelState.AddModelError(
    yearKey, 
    ValidationErrorMessages.DateInvalid
);

bindingContext.ModelState.SetModelValue(
    yearKey, 
    bindingContext.ValueProvider[modelName]
);

Обратите внимание, что должен использоваться один и тот же ключ (yearKey).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...