【问题标题】:Datetime property is not binding causing the model to be null.Datetime 属性未绑定导致模型为空。
【发布时间】:2014-09-25 08:04:54
【问题描述】:

我的 WebAPI 需要如下模型:

型号:

public class MyModel 
{
  public DateTime datetime {get;set; }
}

WebAction 方法:

public IHttpActionResult Post([FromBody] MyModel model)

我正在使用RestSharp 发送请求。

            var restRequest = new RestRequest(url, Method.POST)
            {
                RequestFormat = DataFormat.Json,
            };

            restRequest.AddBody(new MyModel {Datetime =DateTime.Now}, ""); 

但模型绑定始终为空(在 webapi 端)。

我在 Fiddler 中看到以下内容: {"datetime":"2014-09-25T07:22:56.7095909Z}"

任何想法为什么?

【问题讨论】:

  • 模型中的属性名称“datetime”和请求中的“Date”是错字吗?

标签: c# .net asp.net-web-api restsharp


【解决方案1】:

将请求更改为:

restRequest.AddBody(new MyModel { datetime =DateTime.Now}, "");

在 Fiddler 中,您希望看到以下内容:

{"datetime":"2014-09-25T07:22:56.7095909Z}"

因为这将匹配您班级中的属性名称:

public DateTime datetime {get;set; }

然后模型绑定应该能够从请求中获取它,并使用反射在 MyType 实例中找到一个名为“datetime”的属性并为其设置一个值。

【讨论】:

  • 我猜他只是发布了一个错字,否则它不会编译。
  • 能否用您现在在 Fiddler 中看到的值更新问题?肯定不会是{"Date":"2014-09-25T07:22:56.7095909Z}"?附带说明一下,虽然这只是一个错字,但对于能否成功回答这个问题具有重大影响。
  • @JasonEvans:谢谢。我已经更新了这个问题。另外,是不是因为我的webapi 使用了不同的dateformat?
  • 您能否删除[FromBody] 属性并告诉我们会发生什么。结果是什么?有什么区别吗?
  • @JasonEvans:不幸的是,模型绑定仍然为空。我现在将在几秒钟内上传一个非常基本的示例
【解决方案2】:

最后,new JsonMediaTypeFormatter {UseDataContractJsonSerializer = true}; 似乎是罪魁祸首。

详细说明:

在WebApiConfig 类中,我尝试将XmlSerializer 设为默认值,而不是JsonSerializer,后者是WebApi 中的默认值。

但不知不觉我已经设置了UseDataContractJsonSerializer = true。这原来是罪魁祸首。

其实UseDataContractJsonSerializer主要是用来支持WCF序列化的。它序列化所有标记为DataContract的模型属性。

这个问题是,这个序列化程序期望date 是epoch 格式。

在网络中,日期时间属性的行为与给定的here 相同。

我在 SO 回答 here 中提到了这个,这个 SO 回答 here 更漂亮地解释了这一点。

由于我使用的是为 WCF 设计的序列化程序,因此它需要 ASP.NET 格式的日期(例如)\/Date(1234567890)\/.

请注意WebAPI 中的默认序列化程序是 NewtonSoft Json 序列化程序。阅读更多here

因此,要在 WebApi 中使用 Json 序列化程序,只需单独执行 new JsonMediaTypeFormatter()。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多