Ошибка при назначении значения NULL для null-значения int - «Значение« NULL »недопустимо для свойства» - PullRequest
15 голосов
/ 31 августа 2011

У меня есть это свойство в моем представлении модель:

[DisplayName("Region")]
public int? RegionId { get; set; }

Я передаю свою модель представления моему контроллеру, и она завершается с ошибкой на ModelState.IsValid, если RegionId равен нулю. Если я передаю ему целое число, оно работает нормально.

Сообщение об ошибке:

Значение 'null' недопустимо для региона

Я также пытался вызвать это, прежде чем проверить ModelState.IsValid, но я получаю ту же ошибку:

if (viewModel.RegionId == null)
    viewModel.RegionId = (int?)null;

В чем здесь проблема? Почему я не могу присвоить null чему-то, что можно обнулить?

Ответы [ 6 ]

8 голосов
/ 14 сентября 2011

Вот еще одно возможное объяснение.

Я выполняю AJAX POSTing в метод действия MVC, используя jQuery, например:

$.post('url/here',dataObject);

jQuery превратит объект данных в строку запроса. Я использую связыватель модели по умолчанию, чтобы вставить значения в мою модель представления. Проверка модели не удалась: «Значение 'null' недопустимо для имя поля ". Но свойство обнуляемый int. После проверки необработанного POST я обнаружил, что объект данных, который я размещаю, сериализуется в строку запроса, которая выглядит следующим образом:

Field1=null&Field2=value&Field3=value

а не это:

Field1=&Field2=value&Field3=value

Таким образом, проверка модели по понятным причинам жалуется на присвоение строкового литерала 'null' моему nullable int. Одним из решений является проверка на NULL перед отправкой. Хотелось бы, чтобы у меня было время покопаться, но я просто переключился на отправку JSON-представления объекта данных, который правильно обрабатывает нулевые значения.

7 голосов
/ 20 декабря 2013

См. Здесь: Сбой проверки ModelState для типов, допускающих значение NULL

Возможно, передана строка "null".В моем сценарии я обновил пустую строку "" и исправил эту ошибку.

6 голосов
/ 31 августа 2011

В вашем файле Global.asax.cs в методе Application_Start добавьте следующую строку:

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;

Проблема заключается в том, что даже для типа значения, допускающего значение NULL, по умолчанию используется значение "Обязательно"атрибут добавлен по умолчанию ValidatorProvider.

1 голос
/ 31 августа 2011

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

viewModel.RegionId = null;

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

if (viewModel.RegionId.HasValue)
{
    // do something
}
0 голосов
/ 24 февраля 2016

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

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

RegionId = null

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

0 голосов
/ 31 августа 2011

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

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