21

WebAPIポストアクションで次のVMを受信して​​います

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

    [Required]
    public int? Street { get; set; }
}

投稿すると、次のエラーが発生します。

タイプ「ViewModel」のプロパティ「Street」が無効です。[必須]とマークされた値型プロパティも、必須として認識されるように[DataMember(IsRequired = true)]とマークする必要があります。宣言型を[DataContract]で、プロパティを[DataMember(IsRequired = true)]で帰属させることを検討してください。

エラーは明らかなようですので、null許容プロパティが必要なクラスがある場合は、[DataContract]属性と[DataMember]属性を使用する必要があることを完全に確認したいと思います。

Web APIでこれらの属性を使用しないようにする方法はありますか?

4

3 に答える 3

20

私はあなたと同じ問題に直面しています、そしてそれは完全にナンセンスだと思います。値型では[Required]、値型プロパティをnullにできないため、これは機能しないことがわかりますが、null許容値型がある場合は、問題は発生しないはずです。ただし、Web APIモデル検証ロジックは、null許容値とnull許容値の型を同じように処理するように見えるため、回避する必要があります。Web APIフォーラムで回避策を見つけ、それが機能することを確認できます。null許容の値型プロパティ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

これはWebApi2で修正されています。ただし、interestは、フィールドがget/setを持つプロパティである場合にのみ機能します。

于 2018-02-19T02:35:11.070 に答える