【问题标题】:PutAsJsonAsync does not work when dto has data annotations当 dto 有数据注解时,PutAsJsonAsync 不起作用
【发布时间】:2013-05-07 11:45:55
【问题描述】:

我在 DTO 中看到 HttpClient 和 Web API 的一些奇怪行为。当我的属性有数据注释时, HttpClient.PutAsJsonAsync() 不起作用。我在 Web API 端收不到任何东西。一些代码来解释:

我的 MVC 4 网页使用以下代码调用 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)
};

【问题讨论】:

  • 您能否提供一个失败对象的样本? new MyObject { ... }

标签: c# asp.net-web-api dotnet-httpclient


【解决方案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; }
}

仅供参考,最近修复了一个与此场景相关的错误以使事情变得更简单:Overly aggressive validation for applying [DataMember(IsRequired=true)] to required properties with value types

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-20
    • 2021-11-04
    • 2019-10-12
    • 2021-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多