我在Web API Post操作中收到以下VM
public class viewmodel { public string Name { get; set; } [required] public int? Street { get; set; } }
当我发帖时,我会收到以下错误:
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)].
似乎错误是清楚的,所以我只是想要完全确定需要使用[DataContract]和[DataMember]属性,当你有一个需要可空属性的类。
有没有办法避免在Web API中使用这些属性?
解决方法
我正在面对同样的问题,我认为这是完整的废话。使用值类型,我可以看到[必需]不起作用,因为值类型的属性不能为空,但是当您具有可空值类型时,不应该有任何问题。然而,Web API模型验证逻辑似乎以相同的方式处理非可空和可空值类型,因此您必须解决它。我在
Web API forum中找到了一个解决方案,可以确认它的工作原理:创建一个ValidationAttribute子类,并将其替换为对可空值类型属性的requiredAttribute:
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正在使用中:
public class Model { [Nullablerequired] public int? Id { get; set; } }