我在 Web API Post 操作上收到以下虚拟机
public class ViewModel
{
public string Name { get; set; }
[Required]
public int? Street { get; set; }
}
当我发帖时,出现以下错误:
“ViewModel”类型上的属性“Street”无效。标记为 [Required] 的值类型属性还必须标记为 [DataMember(IsRequired=true)] 才能被识别为必需属性。考虑使用 [DataContract] 来归属声明类型,并使用 [DataMember(IsRequired=true)] 来归属属性。
看来错误很明显,所以我只想完全确定当您有一个具有所需可为空属性的类时,需要使用 [DataContract] 和 [DataMember] 属性。
有没有办法避免在 Web API 中使用这些属性?
我和你面临同样的问题,我认为这完全是胡说八道。通过值类型我可以看到[Required]
不起作用,因为值类型属性不能为 null,但是当你有一个可为 null 的值类型时不应该有任何问题。但是,Web API 模型验证逻辑似乎以相同的方式处理不可为空和可为空值类型,因此您必须解决它。我找到了一个解决方法Web API 论坛 http://forums.asp.net/t/1841917.aspx/1并可以确认它是否有效:创建一个ValidationAttribute
子类并应用它而不是RequiredAttribute
对于可为 null 的值类型属性:
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;
}
}
使用中的可为空必需属性:
public class Model
{
[NullableRequired]
public int? Id { get; set; }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)