我在Web API Post动作
上收到以下VMpublic class ViewModel
{
public string Name { get; set; }
[Required]
public int? Street { get; set; }
}
当我发帖时,我收到以下错误:
“ViewModel”类型的媒体“街道”无效。标记为[必需]的值类型属性也必须标记为[DataMember(IsRequired = true)],以便根据需要进行识别。考虑使用[DataContract]归因声明类型,使用[DataMember(IsRequired = true)]归因属性。
似乎错误是清楚的,所以我只想完全确定当你有一个具有必需的可空属性的类时,需要使用[DataContract]和[DataMember]属性。
有没有办法避免在Web API中使用这些属性?
答案 0 :(得分:20)
我面临着和你一样的问题,我认为这完全是胡说八道。使用值类型,我可以看到[Required]
不起作用,因为值类型属性不能为null,但是当你有一个可以为空的值类型时,不应该任何问题。但是,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; }
}
答案 1 :(得分:2)
我认为你遇到了与此处讨论的问题相同的问题:
答案 2 :(得分:0)
这在Web Api 2中得到修复。但是,仅当字段是具有get / set的属性时才有意义。