Подтвердить что ты не робот

Для свойства API с нулевым значением API требуется атрибут DataMember

Я получаю следующую виртуальную машину при действии публикации веб-API

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

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

Когда я делаю сообщение, я получаю следующую ошибку:

Свойство 'Street' для типа 'ViewModel' недействительно. Свойства с типом, помеченные как [Обязательный], также должны быть отмечены значком [DataMember (IsRequired = true)] для распознавания по мере необходимости. Рассмотрим атрибут типа объявления с помощью [DataContract] и свойства с помощью [DataMember (IsRequired = true)].

Кажется, что ошибка ясна, поэтому я просто хочу быть абсолютно уверенным в том, что вам необходимо использовать атрибуты [DataContract] и [DataMember], если у вас есть класс с нулевыми свойствами.

Есть ли способ избежать использования этих атрибутов в веб-API?

4b9b3361

Ответ 1

Я столкнулся с той же проблемой, что и вы, и я думаю, что это полная глупость. С типами значений я вижу, что [Required] не работает, поскольку свойство с типом значений не может быть нулевым, но когда у вас есть тип значения с нулевым значением, не должно быть никаких проблем. Однако логика проверки модели Web API, по-видимому, относится к типам с нулевым и нулевым значениям таким же образом, поэтому вам придется обойти это. Я нашел обход в форуме веб-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; }
}