2013-06-21 44 views
1

我有这样的模式:MVC4剑道电网日期时间模板编辑器

public class MainModel 
{ 
private Guid m_id; 
     public Guid Id 
     { 
      get { return m_id; } 
      set { m_id = value; } 
     } 

     private string m_name; 
     public string Name 
     { 
      get { return m_name; } 
      set { m_name = value; } 
     } 
private ObservableCollection<Foundation> m_foundations; 
     public ObservableCollection<Foundation> Foundations 
     { 
      get 
      { 
       if (m_foundations== null) 
        m_foundations= new ObservableCollection<Foundation>(); 
       return m_foundations; 
      } 
      set { m_foundations= value; } 
     } 
} 

public class Foundation 
{ 
private ObservableCollection<Worker> m_workers; 
     public ObservableCollection<Worker> Workers 
     { 
      get 
      { 
       if (m_workers == null) 
       { 
        m_workers = new ObservableCollection<Worker>(); 
       } 
       return m_workers; 
      } 
      set { m_workers = value; } 
     } 
} 

public class Worker 
{ 
[HiddenInput(DisplayValue = false)] 
     public Guid Id 
     { 
      get { return m_id; } 
      set { m_id = value; } 
     } 
[DataType(DataType.DateTime), DisplayFormat(DataFormatString = "{0:dd-MM-yyyy}", ApplyFormatInEditMode = true)] 
     public DateTime BirthDate 
     { get; set; } 

} 

和我有收到这个MainModel一个partialView:

@using (Html.BeginForm("Save", "Controller", FormMethod.Post, new { ReturnUrl = ViewBag.ReturnUrl })) 
    { 
     @Html.TextBoxFor(m => m.Name) 
     @Html.HiddenFor(m => m.Id) 
<div id="workers"> 
@(Html.Kendo().Grid(Model.Foundations[0].Workers) 
.Name("grid") 
       .Columns(columns => 
       { 
        columns.Command(command => { command.Edit().Text("Edit"); command.Destroy().Text("Delete"); }).Width(200); 
        columns.Bound(p => p.Name); 
        columns.Bound(p => p.BirthDate).Width(100).Format("{0: dd-MM-yyyy}").EditorTemplateName("BirthDate"); 
}) 
.Editable(editable => editable.Mode(GridEditMode.InLine).CreateAt(GridInsertRowPosition.Bottom)) 
.DataSource(dataSource => dataSource 
        .Ajax() 
        .PageSize(20) 
        .Model(model => model.Id(p => p.Id)) 
        .Create(update => update.Action("EditingInline_Create", "Controller")) 
        .Update(update => update.Action("EditingInline_Update", "Controller")) 
        .Destroy(update => update.Action("EditingInline_Destroy", "Controller")) 
        )) 
</div> 

出生日期编辑器有这样的事情

@model DateTime 
@(
    Html.Kendo().DatePickerFor(m=>m).Name("birthDatePicker") 
) 

该模型与所有的属性和日期时间都很好。 问题是: model.Foundations [0] .Workers []。BirthDate有一个有效的日期,但在模板编辑器给我的日期时间minvalue模型。

当我编辑列时,出现的值将像01-01-0001而不是15-03-2006例如。 好吧我只是改变日期,但当我点击更新日期时间的值始终是DateTime.Now。在EditingInline_Update中,参数'worker'将BrithDate更改为DateTime.Now ...我更改的值不存在。

我在某处读到这可能是文化格式化问题,但我完全按照他们的说法: 创建DateModelBinder并将其注册到global.asax中,但在调试时,传递的值是DateTime.Now ...它已经改变了。 Web.config有 我改变了线程当前的文化和UI文化,改变了kendo.culture,在调试中检查了一切似乎是正确的。 我甚至把验证的JavaScript编辑器中:

$("#birthDatePicker").kendoValidator({ 
     rules: { 
      date: function (input) { 
       var d = kendo.parseDate(input.val(), "dd-MM-yyyy"); 
       return d instanceof Date; 
      } 
     } 
    }); 

返回true,在这里我可以看到我想要更改日期,但如果去它在某种程度上变为DateTime.now

我的模型绑定器对不起,但是这让我发疯,我不知道这是否是藏品内藏品的缺陷,或者是否有其他我错过的东西。 Thanx提前

+0

我刚开始使用Kendo Grid的EditorTemplates。我发现在DateFields的模型中添加[UIHint =“DateField”],然后在“〜/ Shared/EditorTemplates/DateField”处添加一个编辑器将会在网格中生成控件的渲染。 –

+0

Thanx Irb,我曾尝试过,它没有工作,但我从一开始就做到了,现在它工作:)。我为每个属性编辑一个编辑器,但现在我为每个数据类型创建一个。唯一不起作用的是试图解析模型联编程序中的日期,因为尝试的值字符串中有时间,所以我重新安排了代码以便随时分析,尽管我不需要它。 Thanx再次的建议 – user2493175

+0

https://kendoeditortemplate.codeplex.com/ –

回答

0

我有一个MVC kendo-ui网格在我的一个项目中,它在编辑模式下的日期工作得很好。我注意到与代码不同的是,我没有在模型中的DateTime属性上编写任何属性。我的模型只是看起来像这样:

public class TransactionViewModel 
{ 
    [Key] 
    public int TransactionId { get; set; } 

    public string Description { get; set; } 

    [Required] 
    public DateTime TransactionDate { get; set; } 

    [Required] 
    public decimal Amount { get; set; } 
} 

在我必将在下面的方式在列格:

columns.Bound(p => p.TransactionDate).Title("Date").Format("{0:yyyy-MM-dd}").EditorTemplateName("TransactionDate"); 

而且,即使我的编辑模板看上去比你有点不同,你的代码提供工作很好,当我测试用你的替换我的。

@model DateTime? 
@(Html.Kendo().DatePicker() 
    .Name("TransactionDate") 
    .Value(Model == null ? DateTime.Now.Date : ((DateTime)@Model).Date) 
) 

要处理文化问题,我已经添加了下面的代码,以及:

@{ 
    var culture = System.Threading.Thread.CurrentThread.CurrentCulture.ToString(); 
} 
<script src="@Url.Content("~/Scripts/cultures/kendo.culture." + culture + ".min.js")"></script> 
<script> 
    kendo.culture("@culture"); 
</script> 

我建议你尝试以下方法:

  • 删除模型的属性来验证它们不会造成任何问题。您可以稍后添加它们,当它工作。
  • 尝试指定不同的日期格式,或不指定日期格式。如果您指定一种格式并且用户的浏览器想要以其他格式呈现它,则可能会遇到麻烦。