gpt4 book ai didi

datetime - MVC 4 单页应用程序和日期时间

转载 作者:行者123 更新时间:2023-12-04 08:28:22 25 4
gpt4 key购买 nike

在玩弄 MVC 4 的新单页应用程序工具时,我注意到我发现的所有示例都没有包含通过 WebApi 更新回 DateTime 的示例。我很快就知道了原因。

我首先从提供的模板生成标准 SPA。然后我打开 TodoItem.cs 并添加了一个 DateTime 字段。然后我按照评论的指示生成了 Controller 。 (没有日期时间字段,一切正常)。

生成所有内容后,我启动了应用程序并导航到 Controller 索引(我将 Controller 称为“任务”)。我按预期获得了 0 条记录的网格页面,然后单击了添加按钮。我按预期进入编辑页面,并在我 Shiny 的新日期时间字段中输入了一些数据,包括日期。然后点击保存。

产生了一个错误,说:

Server error: HTTP status code: 500, message: There was an error deserializing the object of type System.Web.Http.Data.ChangeSetEntry[]. DateTime content '01/01/2012' does not start with '/Date(' and end with ')/' as required for JSON.



该工具似乎还不支持 DateTime。我确信我可以通过并花一些时间来弄清楚它并让它工作,但我想我可能会在这里找到一些已经解决了这个问题并且可以提供洞察力的人的运气。

有人已经为此而战了吗?

更新:我正在添加自询问以来发现的更多信息。我尝试使用 JSON.Net 作为我的格式化程序,如下所示。我认为这将是最终的解决方案,但是,仅仅按照下面推荐的海报是不够的。

使用 JSON.Net 序列化程序时,出现以下错误:

This DataController does not support operation 'Update' for entity 'JObject'.



原因是 JSON.Net 没有完全填充格式化程序试图解轨的对象 (System.Web.Http.Data.ChangeSet)。

发送进来的json是:
[{"Id":"0",
"Operation":2,
"Entity":
{"__type":"TodoItem:#SPADateProblem.Models",
"CreatedDate":"/Date(1325397600000-0600)/",
"IsDone":false,
"Title":"Blah",
"TodoItemId":1},
"OriginalEntity":
{"__type":"TodoItem:#SPADateProblem.Models",
"CreatedDate":"/Date(1325397600000-0600)/",
"IsDone":false,
"Title":"Blah",
"TodoItemId":1}
}]

内置的 Json Formatter 能够将此 Json 重组为一个 ChangeSet 对象,其中在 Entity 和 OriginalEntity 字段中嵌入了 TodoItem 对象。

有没有人让 JSON.Net 正确反序列化?

最佳答案

问题是在当前的测试版中,ASP.NET Web API 使用 DataContractJsonSerializer ,它在 DateTime 的序列化方面存在众所周知的问题。 . Here is最近在 Microsoft Connect 上针对该问题悄悄提出了一个错误; MS 回应说他们已经有一个跟踪问题的错误,但不会在 .Net 4.5/VS11 时间范围内修复。

幸运的是,您可以替换一个替代的 JSON 序列化程序,例如 James Newton-King's优秀 JSON.Net .

ASP.NET 团队的 Henrik Nielsen 有一个 excellent blog展示如何将 JSON.Net 与 ASP.NET Web API 结合使用的帖子。这是他对 MediaTypeFormatter 的实现使用 JSON.Net(它还需要连接到 ASP.NET Web API 配置,Henrik 的博客也演示了这一点)。

public class JsonNetFormatter : MediaTypeFormatter
{
private readonly JsonSerializerSettings settings;

public JsonNetFormatter(JsonSerializerSettings settings = null)
{
this.settings = settings ?? new JsonSerializerSettings();

SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/json"));
Encoding = new UTF8Encoding(false, true);
}

protected override bool CanReadType(Type type)
{
return type != typeof(IKeyValueModel);
}

protected override bool CanWriteType(Type type)
{
return true;
}

protected override Task<object> OnReadFromStreamAsync(Type type, Stream stream, HttpContentHeaders contentHeaders, FormatterContext formatterContext)
{
var ser = JsonSerializer.Create(settings);

return Task.Factory.StartNew(() => {
using (var strdr = new StreamReader(stream))
using (var jtr = new JsonTextReader(strdr))
{
var deserialized = ser.Deserialize(jtr, type);
return deserialized;
}
});
}

protected override Task OnWriteToStreamAsync(Type type, object value, Stream stream, HttpContentHeaders contentHeaders, FormatterContext formatterContext, TransportContext transportContext)
{
JsonSerializer ser = JsonSerializer.Create(settings);

return Task.Factory.StartNew(() =>
{
using (JsonTextWriter w = new JsonTextWriter(new StreamWriter(stream, Encoding)) { CloseOutput = false})
{
ser.Serialize(w, value);
w.Flush();
}
});
}
}

关于datetime - MVC 4 单页应用程序和日期时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9473714/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com