1

DTO を使用した HttpClient と Web API で奇妙な動作が見られます。プロパティにデータ注釈を配置すると、HttpClient.PutAsJsonAsync() が機能しません。Web API 側で何も受信できません。説明するコード:

私の MVC 4 Web ページは、次のコードで Web 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                             
}

受け取る Web 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)
};
4

1 に答える 1

3

私はあなたのシナリオを再現できます.例外メッセージは実際にこの問題の解決策を提供します:

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; }
}

参考までに、このシナリオに関連するバグが最近修正され、物事が単純になりました

于 2013-05-08T19:18:34.097 に答える