Ошибка присваивания 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-представления объекта данных, который правильно обрабатывает нулевые значения.

Ответ 4

Я думаю, что проблема не в присвоении null, это то, что код потребления не содержит нулевого значения. Назначение отлично действует (хотя ваша нулевая проверка инвертирована, а листинг является избыточным).

viewModel.RegionId = null;

В качестве альтернативы вы можете использовать HasValue для проверки нулевого значения типа с нулевым значением. Хотя на самом деле это ничем не отличается от нулевой проверки, выглядит немного чище:

if (viewModel.RegionId.HasValue)
{
    // do something
}

Ответ 5

У меня есть ощущение, что проблема лежит где-то из кода примера, который вы показали. Я создал образец приложения, которое просто создает форму и имеет поле с нулевым значением, но работает как и ожидалось. Я бы начал устранять другие переменные в вашей настройке до тех пор, пока вы не сможете работать с ViewModel с нулевым свойством, и вы сможете определить, что вызывает проблему.

Ответ 6

У меня была проблема с этим.

Моя проблема заключается в том, что я устанавливал свойство нарушения для явного явно в POST. Итак, сродни тому, что у вас есть, запрос выглядел бы так:

RegionId = null

В моем случае это было так же просто, как исключить явное объявление (например, не говорите ему null, просто не отправляйте никаких данных)