-1

我正在使用Microsoft的Entity Framework 6.1.3。數據庫優先(來自Azure SQL Server實例)。自動生成的實體是這樣的 - 數據庫列是DATETIME2(0),但我真的只是想堅持的日期但這是另一個討論:ModelState.IsValid在EF數據庫優先發布日期時間爲false

public partial class Liquidated 
{ 
    public long ID { get; set; } 
    public System.DateTime LiquidationDate { get; set; } 
    public string Comment { get; set; } 
} 

自動生成的控制器:

// POST: api/Liquidations 
    [ResponseType(typeof(Liquidated))] 
    public IHttpActionResult PostLiquidated(Liquidated liquidated) 
    { 

     if (!ModelState.IsValid) 
     { 
      return BadRequest(ModelState); 
     } 

單元測試使用RestSharp:

 var client = new RestClient("http://localhost:64185/api/Liquidations"); 
     var request = new RestRequest(Method.POST); 

     request.AddHeader("cache-control", "no-cache"); 
     request.AddHeader("authorization", "bearer " + token.access_token); 
     request.AddHeader("content-type", "application/x-www-form-urlencoded"); 
     request.AddHeader("audience", "Any"); 
     request.AddHeader("accept-language", "en-gb"); 
     request.AddHeader("accept", "application/json"); 

     var liquidation = new Liquidated(); 

     liquidation.LiquidationDate = DateTime.Now; 
     liquidation.Comments = "Updated group name 1"; 

     request.AddObject(liquidation); 

     IRestResponse<Liquidated> response = client.Execute<Liquidated>(request); 

但是,當我在控制器檢查的ModelState是無效的並給出了LiquidationDate以下格式錯誤:

"The value '18/04/2017 14:26:12' is not valid for LiquidationDate." 

我搜索很多帖子,試圖強行格式化(是C#實體和SQL Server之間的日期格式的問題?),但我看不到我做錯了什麼。任何幫助深表感謝!

+1

模型狀態錯誤是因爲您將錯誤的數據發佈到API,它與實體框架無關。我猜想這很可能與日期格式有關(例如'dd/mm/yyy' vs'mm/dd/yyyy') – DavidG

+0

建議在EF中使用DateTimeOffset。 http://stackoverflow.com/questions/9389954/entity-framework-mapping-datetimeoffset-to-sql-server-datetime –

+0

@DavidG - 感謝您的評論。我從單元測試文件中刪除了任何日期數據並且工作。然後,我在客戶端類中替換了日期時間,並將其更改爲字符串,其中我有完整的格式控制,即yyyy-MM-dd。我認爲我對於RestSharp格式化的能力過分信任 - 不確定它甚至可能,但會發現。 – Bexbissell

回答

0

從@ DavidG的評論繼我改變了客戶端的變現類包含一個字符串,而不是日期時間:

public partial class Liquidated 
{ 
    public long ID { get; set; } 
    public string LiquidationDate { get; set; } 
    public string Comments { get; set; } 
} 

,然後做外RestSharp的格式:

 var client = new RestClient("http://localhost:64185/api/Liquidations"); 
     var request = new RestRequest(Method.POST); 
     request.AddHeader("postman-token", "a95ce9b5-8c7f-e223-faa6-3768f7edd10c"); 
     request.AddHeader("cache-control", "no-cache"); 
     request.AddHeader("authorization", "bearer " + token.access_token); 
     request.AddHeader("content-type", "application/x-www-form-urlencoded"); 
     request.AddHeader("audience", "Any"); 
     request.AddHeader("accept-language", "en-gb"); 
     request.AddHeader("accept", "application/json"); 

     var liquidation = new Liquidated(); 

     liquidation.LiquidationDate = DateTime.Now.ToString("yyyy-MM-dd"); 
     liquidation.Comments = "Updated group name 1"; 

     // request.DateFormat = "yyyy-MM-dd"; // This is ignored by RestSharp 
     request.AddObject(liquidation); 

     IRestResponse<Liquidated> response = client.Execute<Liquidated>(request); 

有閱讀RestSharp GitHub問題日誌:https://github.com/restsharp/RestSharp/issues/629,目前還沒有計劃支持該工具。

感謝您指點我正確的方向。

0

如果將JSON數據發佈到Web API,請確保日期值以ISO 8601格式發送(2017-04-18T14:22:59Z)。否則你會遇到模型綁定器的問題。 JS功能

例爲UTC javascript日期對象轉換爲ISO 8601串(日期只是沒時間):

/// <summary> 
/// Takes a utc js date and converts it to a iso8601 utc string 
/// </summary> 
GlobalJsHelpers.Iso8601FromUtc = function(utcDate) { 
    //create a two digit month string (01-12) 
    var month = ('0' + (utcDate.getUTCMonth() + 1)).substr(-2); 
    //create a two digit day string (01-31) 
    var day = ('0' + utcDate.getUTCDate()).substr(-2); 
    return utcDate.getUTCFullYear() + '-' + month + '-' + day; 
}; 

參見如何欺騙RestSharp Why is RestSharp deserializing two dates differently?

相關問題