ModelState.IsValid 在日期时间 post 上为 false,EF 数据库优先
ModelState.IsValid is false on datetime post with EF Database First
我正在使用 Microsoft 的 Entity Framework 6.1.3。使用数据库优先(来自 Azure SQL 服务器实例)。自动生成的实体看起来像这样 - 数据库列是 datetime2(0) 但实际上我只想保留日期但这是另一个讨论:
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 服务器之间的日期格式化问题吗?)但我看不出我做错了什么。非常感谢任何帮助!
如果将 JSON 数据发布到 Web API,请确保以 ISO 8601 格式发送日期值 (2017-04-18T14:22:59Z
)。否则你 运行 会遇到模型绑定器的问题。
将 UTC Javascript 日期对象转换为 ISO 8601 字符串(只有日期没有时间)的 JS 函数示例:
/// <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;
};
请参阅Why is RestSharp deserializing two dates differently?了解如何欺骗 RestSharp。
根据@DavidG 的评论,我将客户端 Liquidated class 更改为包含字符串而不是日期时间:
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,没有支持此工具的计划。
感谢您为我指明正确的方向。
我正在使用 Microsoft 的 Entity Framework 6.1.3。使用数据库优先(来自 Azure SQL 服务器实例)。自动生成的实体看起来像这样 - 数据库列是 datetime2(0) 但实际上我只想保留日期但这是另一个讨论:
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 服务器之间的日期格式化问题吗?)但我看不出我做错了什么。非常感谢任何帮助!
如果将 JSON 数据发布到 Web API,请确保以 ISO 8601 格式发送日期值 (2017-04-18T14:22:59Z
)。否则你 运行 会遇到模型绑定器的问题。
将 UTC Javascript 日期对象转换为 ISO 8601 字符串(只有日期没有时间)的 JS 函数示例:
/// <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;
};
请参阅Why is RestSharp deserializing two dates differently?了解如何欺骗 RestSharp。
根据@DavidG 的评论,我将客户端 Liquidated class 更改为包含字符串而不是日期时间:
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,没有支持此工具的计划。
感谢您为我指明正确的方向。