在同一Telerik Kendo UI网格中日期格式不同

时间:2015-03-29 15:54:19

标签: json asp.net-mvc-3 datetime kendo-ui kendo-grid

我一直在我的MVC3项目中使用Kendo网格而没有问题。但是最近我添加了一些只有Ajax的MVC剃刀网格和3个日期列。虽然日期格式完全相同,但其中一列只是拒绝被识别为日期而不进行格式化。

我尝试过使用Microsoft json日期格式,然后编写了自己的JsonNetResult类,用于格式化ISO 8601格式的日期,最后我将其更改为生成下面显示的日期格式' yyy-MM-dd HH:MM:SS&#39 ;.这些格式都不允许我重新格式化上传日期'柱!!其他两列相应地被识别为日期和格式。

c#模型(为简洁而删除了其他道具)看起来像:

public class EmailAuditListModel
{
    public DateTime Date { get; set; }
    [DisplayName("Investor's alert sent")]
    public DateTime? InvestorSent { get; set; }
    [DisplayName("Adviser's alert sent")]
    public DateTime? AdviserSent { get; set; }

    public virtual DocumentListModel Document { get; set; }
}

public class DocumentListModel
{
    [DisplayName("DocId")]
    public int DocId { get; set; }

    [DisplayName("Uploaded Date")]
    public DateTime UploadDate { get; set; }
}

JSON是以下格式的集合(删除了额外的字段)。您可以看到日期都是一致的。

{
  "Date": "2015-03-27 17:56:37",
  "InvestorSent": "2015-03-27 17:56:39",
  "AdviserSent": "2015-03-27 17:56:36",
  "Document": {
    "UploadDate": "2015-03-27 17:42:49"
  }
}

Razor视图代码(删除了额外的字段)是:

@(Html.Kendo().Grid<EmailAuditListModel>()
          .Name("EmailAuditGrid")
          .Columns(columns => 
          {
              columns.Bound(e => e.InvestorSent).Format("{0:dd/MM/yyyy HH:mm}").Hidden(true);
              columns.Bound(e => e.AdviserSent).Format("{0:dd/MM/yyyy HH:mm}").Hidden(true);
              columns.Bound(e => e.Document.UploadDate).Format("{0:dd/MM/yyyy HH:mm}");
          })
          .Groupable()
          .Sortable()
          .Filterable()
          .Resizable(resize => resize.Columns(true))
          .Pageable(pageable => pageable
              .Refresh(true)
              .PageSizes(true)
              .ButtonCount(5))
          .DataSource(datasource => datasource
              .Ajax()
              .Read(read => read.Action("EmailAudits_Read","Document"))
              .Sort(sort => sort.Add(e => e.Document.UploadDate).Descending()))
          .ColumnMenu()
          )

...网格看起来像

Screenshot of grid showing 3 date columns

任何想法??

2 个答案:

答案 0 :(得分:3)

上传日期不同的原因是由于被识别为字符串类型而不是日期类型。遗憾的是,这是绑定到网格的DataSource对象的限制。为了正确获取日期格式,您可以尝试以下方法之一:

1)将日期放在模型对象的根级别(根据@ suvroc&#39; s),这很好但意味着你必须改变你的模型才能与前端一起工作。

2)在子模型中提供字符串格式化的Date版本,如下所示:

public class DocumentListModel
{
    [DisplayName("DocId")]
    public int DocId { get; set; }

    [DisplayName("Uploaded Date")]
    public DateTime UploadDate { get; set; }

    [DisplayName("Uploaded Date")]
    public string UploadDateToString 
    {
        get
        { 
            return UploadDate.toString("dd/MM/yyyy HH:mm");
        }
    }
}

然后从当前上传的属性更改此属性的网格绑定。

3)使用内置客户端模板重新格式化列,如下所示:

columns.Bound(e => e.Document.UploadDate)
.ClientTemplate("#=reformatDateTime(data.Document.UploadDate,'dd/MM/yyyy HH:mm')#");

然后使用这样的javascript函数:

function reformatDateTime(dateValue, dateFormat){
     return kendo.toString(kendo.parseDate(dateValue), dateFormat); 
}

这样做的目的是转换有效日期对象中的日期值,然后根据传入的日期格式对其进行格式化。

我个人更喜欢自己选择3,因为它更简单,更易于维护,一旦编写,它可以在任何地方重复使用。

嗯,我希望这会有所帮助,如果您需要更多信息,请给我一个大喊。

答案 1 :(得分:2)

我遇到此问题的第一种方法是在将模型传递给Kendo Grid配置之前展平模型。

public class EmailAuditListModelFlat
{
    public DateTime Date { get; set; }
    public DateTime? InvestorSent { get; set; }
    public DateTime? AdviserSent { get; set; }
    public DateTime DocumentUploadDate { get; set; }
}

PS。可能它应该是一个评论,但我还不能写呢