PutAsJsonAsync не работает, когда dto имеет аннотации данных

Я наблюдаю какое-то странное поведение с HttpClient и веб-API с моими DTO. Когда у меня есть аннотации данных для моих свойств, HttpClient.PutAsJsonAsync() не работает. Я ничего не могу получить в конце веб-API. Некоторый код для объяснения:

Моя веб-страница MVC 4 вызывает веб-API с помощью этого кода:

using (var client = new HttpClient())
{
    var response = client.PutAsJsonAsync(uri+"/"+MyObject.Id, MyObject).Result;
    response.EnsureSuccessStatusCode(); // Returns 500 when i use MyObject with annotations                             
}

Код контроллера веб-API для получения. Обратите внимание, что это даже не срабатывает, когда у MyObject есть аннотации:

public MyObject Put(MyObject myObject)
{
        try
        {
            if (myObject == null) throw new NullReferenceException();
        }
        catch (Exception e)
        {
            throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.BadRequest));
        }
}

MyObject DTO, когда он работает:

public class MyObject
{
    public int Id { get; set; }
    public Nullable<int> AuditProgramId { get; set; }
    public string Title { get; set; }
    public System.DateTime StartDate { get; set; }
    public System.DateTime EndDate { get; set; }
 }

MyObject DTO, когда он не работает:

public class MyObject
{
    public int Id { get; set; }
    public Nullable<int> AuditProgramId { get; set; }
    [Required]
    public string Title { get; set; }
    [Required, DataType(DataType.Date)]
    public System.DateTime StartDate { get; set; }
    [Required, DataType(DataType.Date)]
    public System.DateTime EndDate { get; set; }
 }

Любые идеи?

ОБНОВЛЕНИЕ 1

Он работает с этими значениями без аннотаций, но не работает с аннотациями:

var myObj = new MyObject {
    Id=4,
    Title="Test Title",
    StartDate=DateTime.Today,
    EndDate=DateTime.Today.AddDays(2)
};

person gixen    schedule 07.05.2013    source источник
comment
Не могли бы вы включить образец объекта, который не работает? new MyObject { ... }   -  person Markus Jarderot    schedule 07.05.2013


Ответы (1)


Я могу воспроизвести ваш сценарий, и сообщение об исключении фактически обеспечивает решение этой проблемы:

Property 'StartDate' on type 'MvcApplication.Model.MyObject' is invalid. Value-typed properties marked as [Required] must also be marked with [DataMember(IsRequired=true)] to be recognized as required. Consider attributing the declaring type with [DataContract] and the property with [DataMember(IsRequired=true)].

Я соответствующим образом изменил свой класс MyObject, и ваш сценарий заработал.

[DataContract]
public class MyObject
{
    [DataMember]
    public int Id { get; set; }

    [DataMember]
    public Nullable<int> AuditProgramId { get; set; }

    [DataMember]
    [Required]
    public string Title { get; set; }

    [Required, DataType(DataType.Date)]
    [DataMember(IsRequired = true)]
    public System.DateTime StartDate { get; set; }

    [Required, DataType(DataType.Date)]
    [DataMember(IsRequired = true)]
    public System.DateTime EndDate { get; set; }
}

К вашему сведению, ошибка, связанная с этим сценарием, была недавно исправлена ​​для упрощения: Слишком агрессивная проверка для применения =true)] в требуемые свойства с типами значений

person Maggie Ying    schedule 08.05.2013