21

我在 Web API Post 操作上收到以下 VM

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 中使用这些属性?

4

3 回答 3

20

我和你面临同样的问题,我认为这完全是胡说八道。对于值类型,我可以看到这[Required]是行不通的,因为值类型的属性不能为空,但是当你有一个可以为空的值类型时,不应该有任何问题。但是,Web API 模型验证逻辑似乎以相同的方式处理不可空值和可空值类型,因此您必须解决它。我在Web API 论坛中找到了一种解决方法,并且可以确认它有效:创建一个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; }
}
于 2013-02-01T20:31:53.013 回答
2

我认为您遇到了与此处讨论的相同的问题:

必需属性的 DataAnnotation

于 2012-11-30T22:41:46.537 回答
0

这在 Web Api 2 中已修复。但是,只有当字段是带有 get/set 的属性时,才有意义。

于 2018-02-19T02:35:11.070 回答