Asp.net mvc MVC4剑道网格日期时间模板编辑器

Asp.net mvc MVC4剑道网格日期时间模板编辑器,asp.net-mvc,grid,kendo-ui,datetimepicker,Asp.net Mvc,Grid,Kendo Ui,Datetimepicker,我有这个模型: 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 {

我有这个模型:

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; }

}
模型的所有属性和日期时间都很好。 问题是: model.Foundations[0].Workers[].BirthDate具有有效的日期,但在模板编辑器中,使用minvalue model为我提供了日期时间

例如,当我编辑列时,显示的值将类似于01-01-0001,而不是15-03-2006。 好的,我只是更改了日期,但当我单击“更新”时,DateTime的值始终是DateTime.Now。在EditingLine\u Update中,参数“worker”将BrithDate更改为DateTime。现在…我更改的值不存在

我在某个地方读到,这可能是一个文化形成问题,但我完全按照他们说的做了: 创建了一个DateModelBinder并在global.asax中注册了它,但是在调试中,传递的值是DateTime。现在…它已经在那里更改了。 Web.config已被删除 我更改了线程当前区域性和UIculture,更改了kendo.culture,签入调试,一切似乎都正常。 我甚至将javascript验证程序放在编辑器中:

$("#birthDatePicker").kendoValidator({
        rules: {
            date: function (input) {
                var d = kendo.parseDate(input.val(), "dd-MM-yyyy");
                return d instanceof Date;
            }
        }
    });
这将返回true,在这里我可以看到我想要更改的日期,但是当转到modelbinder时,它会以某种方式更改为DateTime.now

我很抱歉这么长时间,但这让我发疯了,我不知道这是否是一个有收藏的错误,还是我错过了什么。
Thanx提前

我的一个项目中有一个MVC剑道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>
@{
var culture=System.Threading.Thread.CurrentThread.CurrentCulture.ToString();
}
剑道文化(“文化”);
我建议您尝试以下方法:

  • 删除模型中的属性,以验证它们不会导致任何问题。你可以在一切正常后再添加它们
  • 尝试指定其他日期格式,或不指定日期格式。如果指定一种格式,而用户的浏览器希望以另一种格式呈现,则可能会遇到麻烦

我刚开始为剑道网格使用EditorTemplates。我发现在DateFields的模型中添加[UIHint=“DateField”],然后在“~/Shared/EditorTemplates/DateField”中添加一个编辑器,可以在网格中呈现控件。Thanx Irb,我以前尝试过,但没有成功,但我从一开始就再次尝试,现在成功了:)。我为每个属性制作了一个编辑器,但现在我为每个数据类型制作了一个编辑器。唯一不起作用的事情是试图在模型绑定器中解析日期,因为尝试的值字符串中有时间,所以我重新安排了代码,以使用时间进行解析,尽管我不需要时间。Thanx再次建议这当然是问题我是haivng…由于文化问题,我的日期始终为空…因为我有en GB文化,剑道网格datetime列始终有默认文化,ny posy back值始终为01/01/0001…dman
@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>