I have this property in my view model:
[DisplayName(\"Region\")]
public int? RegionId { get; set; }
I pass my view model to my controller,
Here's another possible explanation.
I am AJAX POSTing to an MVC action method using jQuery like so:
$.post('url/here',dataObject);
jQuery will turn the data object into a query string. I use the default model binder to push the values into my ViewModel. Model validation fails with "The value 'null' is not valid for field name". But the property is a nullable int. After inspecting the raw POST I find that the data object I am POSTing is serialized into a query string that looks like this:
Field1=null&Field2=value&Field3=value
and not this:
Field1=&Field2=value&Field3=value
So model validation is understandably complaining about assigning the string literal 'null' to my nullable int. One solution is to check for NULLs before POSTing. I wish I had time to dig in more but I just switched to sending a JSON representation of the data object which correctly handles the null values.
I have a feeling the problem lies somewhere out of the sample code you have shown. I have created a sample application that just creates a form and has a nullable field, but it works as expected. I would start eliminating other variables in your setup until you can to a working ViewModel with a nullable property, and you should be able to identify what is causing the problem.
See here: ModelState validation fails for nullable types
The string "null" may be being passed. In my scenario I updated to an empty string "" and resolved this error.
I think the issue is not assigning null, it's that the consuming code does not except a null value. The assignment is perfectly valid (although your null check is inverted, and the cast is redundant).
viewModel.RegionId = null;
As an aside you can use HasValue to check for null on a nullable type. Although in reality this it's no different to a null check, just looks a bit cleaner:
if (viewModel.RegionId.HasValue)
{
// do something
}
I had a problem with this.
My problem with this is that I was setting the offending property to null explicitly in the POST. So, akin to what you have, the request would've looked like:
RegionId = null
In my case, it was as simple as omitting the explicit declaration (e.g., don't say it's null, just don't send any data)
In your Global.asax.cs file, in the Application_Start method, add the following line:
DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;
The issue is that, even for a nullable value type, by default, a "Required" attribute is added by the default ValidatorProvider.