gpt4 book ai didi

javascript - 在 C# 和 JavaScript 之间传递日期

转载 作者:太空宇宙 更新时间:2023-11-03 15:03:15 24 4
gpt4 key购买 nike

我有一个返回 View 模型的 ASP.Net MVC 应用程序,当使用 system.web.mvc.jsonresult 将其转换为 JSON 时,它看起来如下所示:

enter image description here

在客户端上,我使用的是 KnockoutJS。我使用 MomentJS 来格式化 VoucherDate 的值,以便它可以显示给人类:

 var recsArray = [];
$.each(data.Vouchers, function (key, value) {
recsArray.push(
new edited(
interchangeId,
value.SupplierIsValid,
value.VoucherNo,
value.LegacySupplierId,
value.Transactions,
moment(value.OriginalVoucher.VoucherDate).format('YYYY/MM/DD HH:mm'),
value.OriginalVoucher
)
);

从前面的代码片段可以看出,除了将数据推送到可观察数组中以在 KOGrid 中显示外,我还推送了整个“OriginalVoucher”。这使用户能够编辑“LegacySupplierId”的值并单击“重新提交”,这将回传整个 View 模型,如下所示:

self.resubmit = function () {
var data = {
Vouchers: ko.toJS(this.recs),
BatchId: self.batchId(),
InterchangeId: interchangeId,
IsReadWrite: self.isReadWrite,
Interface: self.interface,
ReportClient: self.reportClient
};

$.ajax({
type: "POST",
url: BASE_URL + 'EditBatch/ResubmitRejectedVouchersAsNewBatch',
data: ko.toJSON(data),

我已使用 Fiddler 检查并确认 VoucherDate 字段包含/Date(14543712000000)/等值。我的问题是,在 C# Controller 中读取时,所有日期都显示为 1/1/0001 12:00:00 AM。

enter image description here

我读到 javascript 有一个 date.toISOString() 函数可以转换成 C# 会满意的格式。有没有更好的方法尝试在 javascript View 模型中找到每个日期字段并在回发到 C# Controller 之前对每个日期字段执行转换

我想我之前已经按照此处的说明使用 automapper 解决了这个问题:enter link description here

在我的源代码中,我可以看到我创建了以下类,但我不知道如何/是否使用它:

public class JsonDateTimeTypeConvertor : ITypeConverter<string, DateTime>
{
public DateTime Convert(ResolutionContext context)
{
string jsonDate = context.SourceValue.ToString();

string offsetAsString = Regex.Match(jsonDate, @"\d+").Value;
double offset = System.Convert.ToDouble(offsetAsString);

DateTime ret = DataUtils.ConvertFromUnixTimestamp(offset);

return ret;
}

}

我认为它正在被使用,但我无意中禁用了它。这可能发生在我更改 Controller 接收到的 ViewModel 的类型时。该应用程序的先前版本有效,所以我猜日期时间已正确转换 - 可能是通过此自动映射器扩展。我已经从 TFS 中提取了旧版本的代码,但无法弄清楚它是如何发挥作用的——我希望当时我能做更好的笔记!我只有:

I needed to create a custom type convertor to deal with JSON dates being passed to the EditBatch controller in the format of number of milliseconds since 1900.

I followed the wiki documentation from here:

https://github.com/AutoMapper/AutoMapper/wiki/Custom-type-converters

最佳答案

或许您可以使用这样的正则表达式模式。以下代码显示了为您执行此操作的 ToJavaScriptDate() 函数:

function ToJavaScriptDate(value) 
{
var pattern = /Date\(([^)]+)\)/;
var results = pattern.exec(value);
var dt = new Date(parseFloat(results[1]));
return (dt.getMonth() + 1) + "/" + dt.getDate() + "/" + dt.getFullYear();
}

ToJavaScriptDate() 函数接受/Date(ticks)/格式的值并返回 MM/dd/yyyy 格式的日期字符串。在内部,ToJavaScriptDate() 函数使用表示模式/Date(([^)]+))/的正则表达式。

exec() 方法接受源日期值并测试该值是否匹配。 exec() 的返回值是一个数组。在这种情况下,结果数组 (results[1]) 的第二个元素包含源日期的刻度部分。例如,如果源值为/Date(836418600000)/,则 results[1] 将为 836418600000。基于此 ticks 值形成 JavaScript Date 对象。 Date 对象有一个构造函数,它接受自 1970 年 1 月 1 日以来的毫秒数。因此 dt 持有一个有效的 JavaScript Date 对象。 ToJavaScriptDate() 函数然后将日期格式化为 MM/dd/yyyy 并返回给调用者。

关于javascript - 在 C# 和 JavaScript 之间传递日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45038242/

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