我一直在我的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()
)
...网格看起来像
任何想法??
答案 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。可能它应该是一个评论,但我还不能写呢