I am receiving the following VM on a Web API Post action
public class ViewModel
{
public string Name { get; set; }
[Required]
public int? Street { get; set; }
}
When I make a post I get the following error:
Property 'Street' on type 'ViewModel' is invalid. Value-typed properties marked as [Required] must also be marked with [DataMember(IsRequired=true)] to be recognized as required. Consider attributing the declaring type with [DataContract] and the property with [DataMember(IsRequired=true)].
It seems the error is clear so I just want to be completely sure that it is required to use [DataContract] and [DataMember] attributes when you have a class with required nullable properties.
Is there a way to avoid using these attributes in Web API?
I think you are running into the same problem as discussed here:
DataAnnotation for Required property
This is fixed in Web Api 2. However, interesting only works if the fields are properties with get/set.
I'm facing the same problem as you, and I think it's complete nonsense. With value types I can see that
[Required]
doesn't work since a value-typed property can't be null, but when you've got a nullable value type there shouldn't be any issue. However, the Web API model validation logic seems to treat non-nullable and nullable value types the same way, so you have to work around it. I found a work-around in the Web API forum and can confirm that it works: Create aValidationAttribute
subclass and apply it instead ofRequiredAttribute
on nullable value-typed properties:NullableRequiredAttribute in use: