2014-09-25 34 views
0

我的WebAPI期待像下面的模型:Datetime屬性未綁定,導致模型爲空。

型號:

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方面)。

我看到提琴手如下: {"datetime":"2014-09-25T07:22:56.7095909Z}"

任何想法,爲什麼?

+2

是模型中的屬性名稱「datetime」和請求中的「日期」錯字? – 2014-09-25 08:08:11

回答

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 Serializer。更多詳情,請參閱here

因此,要在WebApi中使用Json串行器,只需單獨執行new JsonMediaTypeFormatter()

+1

公平競賽,很棒的發現:)幹得好。 – 2014-09-26 11:35:36

2

更改請求:

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

在提琴手,你希望被看到的是:

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

因爲這將匹配你的類屬性的名稱:

public DateTime datetime {get;set; }

模型綁定應該能夠從請求中選擇它,並使用反射在MyType實例中找到名爲「datetime」的屬性併爲其設置一個值。

+3

我猜他只是發佈了一個錯字,否則就不會編譯。 – DavidG 2014-09-25 08:17:59

+0

這只是一個錯字 – 2014-09-25 08:45:48

+0

@Jason Evans:我已經更新了這個問題。 – 2014-09-25 08:58:57