Web API nullable required property requires DataMember attribute

前端 未结 3 616
不知归路
不知归路 2021-02-01 05:55

I am receiving the following VM on a Web API Post action

public class ViewModel
{
    public string Name { get; set; }

    [Required]
    public int? Street {          


        
相关标签:
3条回答
  • 2021-02-01 05:59

    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 a ValidationAttribute subclass and apply it instead of RequiredAttribute on nullable value-typed properties:

    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    using System.Web.Mvc;
    
    public class NullableRequiredAttribute : ValidationAttribute, IClientValidatable
    {
        public bool AllowEmptyStrings { get; set; }
    
        public NullableRequiredAttribute()
            : base("The {0} field is required.")
        {
            AllowEmptyStrings = false;
        }
    
        public override bool IsValid(object value)
        {
            if (value == null)
                return false;
    
            if (value is string && !this.AllowEmptyStrings)
            {
                return !string.IsNullOrWhiteSpace(value as string);
            }
    
            return true;
        }
    
        public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
        {
            var modelClientValidationRule = new ModelClientValidationRequiredRule(FormatErrorMessage(metadata.DisplayName));
            yield return modelClientValidationRule;
        }
    }
    

    NullableRequiredAttribute in use:

    public class Model
    {
        [NullableRequired]
        public int? Id { get; set; }
    }
    
    0 讨论(0)
  • 2021-02-01 06:12

    I think you are running into the same problem as discussed here:

    DataAnnotation for Required property

    0 讨论(0)
  • 2021-02-01 06:20

    This is fixed in Web Api 2. However, interesting only works if the fields are properties with get/set.

    0 讨论(0)
提交回复
热议问题