Ошибка присваивания null nullable int - "Значение" null "недействительно для свойства"
У меня есть это свойство в моей модели:
[DisplayName("Region")]
public int? RegionId { get; set; }
Я передаю свою модель представления моему контроллеру, и он не работает в ModelState.IsValid
, если RegionId имеет значение null. Если я передаю ему целое число, он отлично работает.
Сообщение об ошибке:
Значение "null" недопустимо для Region
Я также пробовал называть это, прежде чем проверять ModelState.IsValid
, но получаю ту же ошибку:
if (viewModel.RegionId == null)
viewModel.RegionId = (int?)null;
В чем проблема? Почему я не могу присвоить значение NULL для значения, которое является допустимым?
Ответы
Ответ 1
В файле Global.asax.cs в методе Application_Start добавьте следующую строку:
DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;
Проблема в том, что даже для типа значений с нулевым значением по умолчанию атрибут "Обязательный" добавляется по умолчанию ValidatorProvider.
Ответ 2
Вот еще одно возможное объяснение.
Я AJAX POSTing для метода действия MVC с использованием jQuery, например:
$.post('url/here',dataObject);
jQuery превратит объект данных в строку запроса. Я использую связующее устройство по умолчанию, чтобы вставить значения в мой ViewModel. Проверка модели не выполняется: "Значение" null "недопустимо для имени поля". Но свойство является nullable int. После проверки исходного POST я обнаружил, что объект данных, который я являюсь POSTING, сериализуется в строку запроса, которая выглядит так:
Field1=null&Field2=value&Field3=value
а не это:
Field1=&Field2=value&Field3=value
Таким образом, проверка модели, по-видимому, жалуется на назначение строкового литерала 'null' для моего nullable int. Одним из решений является проверка NULL перед POST. Мне жаль, что у меня не было времени, чтобы копать больше, но я просто переключился на отправку JSON-представления объекта данных, который правильно обрабатывает нулевые значения.
Ответ 3
См. здесь Ошибка проверки ModelState для типов с нулевым значением
Может передаваться строка "null". В моем сценарии я обновил до пустой строки "" и разрешил эту ошибку.
Ответ 4
Я думаю, что проблема не в присвоении null, это то, что код потребления не содержит нулевого значения. Назначение отлично действует (хотя ваша нулевая проверка инвертирована, а листинг является избыточным).
viewModel.RegionId = null;
В качестве альтернативы вы можете использовать HasValue
для проверки нулевого значения типа с нулевым значением. Хотя на самом деле это ничем не отличается от нулевой проверки, выглядит немного чище:
if (viewModel.RegionId.HasValue)
{
// do something
}
Ответ 5
У меня есть ощущение, что проблема лежит где-то из кода примера, который вы показали. Я создал образец приложения, которое просто создает форму и имеет поле с нулевым значением, но работает как и ожидалось. Я бы начал устранять другие переменные в вашей настройке до тех пор, пока вы не сможете работать с ViewModel с нулевым свойством, и вы сможете определить, что вызывает проблему.
Ответ 6
У меня была проблема с этим.
Моя проблема заключается в том, что я устанавливал свойство нарушения для явного явно в POST. Итак, сродни тому, что у вас есть, запрос выглядел бы так:
RegionId = null
В моем случае это было так же просто, как исключить явное объявление (например, не говорите ему null, просто не отправляйте никаких данных)