C# jQuery数据表编辑器插件日期时间格式问题

C# jQuery数据表编辑器插件日期时间格式问题,c#,jquery,asp.net-mvc,datetime,datatables,C#,Jquery,Asp.net Mvc,Datetime,Datatables,我正在为一个站点使用EF6+MVC。dataTables编辑器用于UI。一个表有一个字段“StartDate”。它是SQL Server中的日期时间类型 在我尝试编辑“StartDate”值之前,它工作正常。从浏览器调试中,我可以看到从后端发送到UI的JSON是时间戳格式的,即/Date(1541923200000)/ 在dataTables中,我将其转换为正确的本地日期时间格式,以便正确显示 然而,我不知道如何在编辑器插件中做到这一点。它总是显示/日期(1541923200000)/ 我使

我正在为一个站点使用EF6+MVC。dataTables编辑器用于UI。一个表有一个字段“StartDate”。它是SQL Server中的日期时间类型

在我尝试编辑“StartDate”值之前,它工作正常。从浏览器调试中,我可以看到从后端发送到UI的JSON是时间戳格式的,即/Date(1541923200000)/

在dataTables中,我将其转换为正确的本地日期时间格式,以便正确显示

然而,我不知道如何在编辑器插件中做到这一点。它总是显示/日期(1541923200000)/

我使用的代码是:

editorAdvertisement = new $.fn.dataTable.Editor({
    ajax: '/APN/GetAdvertisementData',

    table: "#tblAdvertisements",
    fields: [{
        label: "StartDate",
        name: "AdvStartDate"
        , type: "datetime"
        , format: 'MM\/DD\/YYYY h:mm a'
    }, {
        label: "Deadline",
        name: "AdvDeadline"
        , type: "datetime"
    }, {
        label: "TitleOfAdv",
        name: "TitleOfAdv"
    }, {
        label: "ListPrice",
        name: "ListPrice"
    }
    ]
});

var tbl = $('#tblAdvertisements').DataTable({
    pageLength: 10,
    dom: '<"html5buttons"B>lTfgitp',
    ajax: '/APN/GetAdvertisementData'
    ,
    columns: [
        {
            data: "AdvStartDate", name: "AdvStartDate"
            , type: "datetime"
                , render: function (value) {
                    var r = convertDate(value);
                    return r;
                }
            , "autoWidth": true
        },
        {
            data: "AdvDeadline", name: "AdvDeadline"
            , type: "datetime"
            , render: function (value) {
                var r = convertDate(value);
                return r;
            }
            , "autoWidth": true
        },
        { data: "TitleOfAdv", name: "TitleOfAdv", "autoWidth": true },
        {
            data: "ListPrice", name: "ListPrice", "autoWidth": true
            , render: $.fn.dataTable.render.number(',', '.', 0, '$')
        }
    ],
    order: [1, 'asc'],
    select: {
        style: 'os',
        selector: 'td:first-child'
    },
    buttons: [
        { extend: "create", editor: editorAdvertisement }
        , { extend: "edit", editor: editorAdvertisement }
        , { extend: "remove", editor: editorAdvertisement }

    ]
    , select: true
    , searching: false
    , paging: false

});
editoradvisement=new$.fn.dataTable.Editor({
ajax:“/APN/GetAdvertisementData”,
表:“#tbladdervisions”,
字段:[{
标签:“起始日期”,
名称:“AdvStartDate”
,类型:“日期时间”
,格式:“MM\/DD\/YYYY h:MM a”
}, {
标签:“截止日期”,
名称:“最后期限”
,类型:“日期时间”
}, {
标签:“TitleOfAdv”,
名称:“TitleOfAdv”
}, {
标签:“标价”,
名称:“标价”
}
]
});
变量tbl=$('#tbladvertisions')。数据表({
页长:10,
dom:“lTfgitp”,
ajax:“/APN/GetAdvertisementData”
,
栏目:[
{
数据:“AdvStartDate”,名称:“AdvStartDate”
,类型:“日期时间”
,呈现:函数(值){
var r=转换日期(值);
返回r;
}
,“自动宽度”:真
},
{
数据:“advDudate”,名称:“advDudate”
,类型:“日期时间”
,呈现:函数(值){
var r=转换日期(值);
返回r;
}
,“自动宽度”:真
},
{数据:“TitleOfAdv”,名称:“TitleOfAdv”,“autoWidth”:true},
{
数据:“ListPrice”,名称:“ListPrice”,“autoWidth”:真
,render:$.fn.dataTable.render.number(“,”,“,”,0,“$”)
}
],
订单:[1,‘asc'],
选择:{
风格:“os”,
选择器:“td:第一个孩子”
},
按钮:[
{扩展:“创建”,编辑器:editoradvisement}
,{扩展:“编辑”,编辑:编辑广告}
,{扩展:“删除”,编辑器:editoradvisement}
]
,选择:true
,搜索:false
,分页:false
});
在控制器中

[AcceptVerbs(HttpVerbs.Get | HttpVerbs.Post)]
public ActionResult GetAdvertisementData()
{
    var request = HttpContext.Request.Form;
    var settings = Properties.Settings.Default;

    using (var db = new Database(settings.DbType, settings.DbConnection))
    {
        var response = new Editor(db, "Advertising", new[] { "AdvertisingID" })
            .TryCatch(false)
            .Model<Advertising2>()
            .Field(new Field("AdvStartDate")
                .Validator(Validation.DateFormat(
                    "MM/dd/yyyy",
                    new ValidationOpts { Message = "Please enter a date in the format MM/dd/yyyy" }
                ))
                .GetFormatter(Format.DateTime("yyyy-MM-dd HH:mm:ss", "MM/dd/yyyy"))
                .SetFormatter(Format.DateTime("MM/dd/yyyy", "yyyy-MM-dd HH:mm:ss"))
            )
            .Field(new Field("AdvDeadline")
                .Validator(Validation.DateFormat(
                    "MM/dd/yyyy",
                    new ValidationOpts { Message = "Please enter a date in the format MM/dd/yyyy" }
                ))
                .GetFormatter(Format.DateSqlToFormat("MM/dd/yyyy"))
                .SetFormatter(Format.DateFormatToSql("MM/dd/yyyy"))
            )

            .Field(new Field("TitleOfAdv"))
            .Field(new Field("ListPrice"))

            .Process(request)
            .Data();

        return Json(response, JsonRequestBehavior.AllowGet);
    }
}
[AcceptVerbs(HttpVerbs.Get | HttpVerbs.Post)]
公共操作结果GetAdvertisementData()
{
var request=HttpContext.request.Form;
var settings=Properties.settings.Default;
使用(var db=new数据库(settings.DbType,settings.DbConnection))
{
var response=neweditor(db,“advisting”,new[]{“advisingid”})
.TryCatch(错误)
.Model()
.字段(新字段(“AdvStartDate”)
.Validator(Validation.DateFormat(
“MM/dd/yyyy”,
new ValidationOpts{Message=“请以MM/dd/yyyy”格式输入日期”}
))
.GetFormatter(Format.DateTime(“yyyy-MM-dd-HH:MM:ss”,“MM/dd/yyyy”))
.SetFormatter(格式.DateTime(“MM/dd/yyy”,“yyyy-MM-dd HH:MM:ss”))
)
.字段(新字段(“AdvDeadline”)
.Validator(Validation.DateFormat(
“MM/dd/yyyy”,
new ValidationOpts{Message=“请以MM/dd/yyyy”格式输入日期”}
))
.GetFormatter(格式为.DateSqlToFormat(“MM/dd/yyyy”))
.SetFormatter(格式为.DateFormatToSql(“MM/dd/yyyy”))
)
.字段(新字段(“标题OFADV”))
.Field(新字段(“ListPrice”))
.程序(请求)
.Data();
返回Json(response,JsonRequestBehavior.AllowGet);
}
}

经过长时间的搜索,我没能找到它。有人有同样的问题吗?有什么解决办法吗?

我也遇到了同样的问题,最终在网上找到了答案

如果你用fiddler(一个观察发生了什么的好工具)来观察,你会发现 请看JSON的格式。如果您查看中的代码 visual studio express并捕获您在将其传递给 JSON您会看到类似“{12/12/2012 12:12}”的内容。所以实际上 原因是JSON

重构到第一篇专栏文章中的要点应该是这样的

这种方法毫无问题地解决了我的问题。此版本旨在将空日期呈现为空白,否则按指示格式化(更新:再次重构答案,发现第二天早上格式化的代码没有按预期运行。)

查看moment.js(),下载moment-with-locales.js并将其添加到BundleConfig.cs中的脚本包中

然后,在datatable的javascript代码中,您可以按如下所示的正确日期/时间格式呈现列。注意:我的语言环境是“pt”(葡萄牙)。日期列呈现为dd/mm/yyyy hh:mm(再次请参见中的格式选项)

希望这些信息能有用。我也被这件事困扰了几个小时


José

var r=convertDate(值)=>我看不到convertDate函数包含的内容,您能提供吗?该
/Date(xxxxxxxxxxxx)/
格式称为
DateTime
对象值,表示为以毫秒为单位的字符串。该函数用于将时间戳转换为yyyy-MM-dd,但它仅在数据表中正确显示,而不在编辑器中正确显示。
{ 
   data: "AdvStartDate", 
   render: function (data, type, full) {
          if (data != null) {
                 var dtStart = new Date(parseInt(data.substr(6)));
                 return dtStart.toLocaleDateString();
          } else {
                 return "";
          }
   }
"columns": [
        { "data": "OriginName" },
        { "data": "SmsID" },
        { "data": "DestinationNumber" },
        {
            "data": "SMSDeliveryDate",
            "render": function (data) {
                var re = /-?\d+/;
                var m = re.exec(data);
                var d = new Date(parseInt(m[0]));
                moment.locale('pt');
                var m = moment(d).format('L LTS');
                return m;
            }
        },
        { "data": "SmsStateDesc" }
    ],