2013-06-21 2 views
1

У меня есть эта модель:MVC4 Кендо Сетка DateTime шаблон редактора

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

} 

и у меня есть PartialView, который принимает этот MainModel:

@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> 

Редактор BirthDate есть что-то вроде этого

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

модель просто хороша со всеми свойствами и временем. проблема: the model.Foundations [0] .Workers []. Дата рождения имеет действительную дату, но в редакторе шаблонов дается мне datetime с моделью minvalue.

, когда я редактирую столбец, значение, которое появляется, например, будет 01-01-0001 вместо 15-03-2006. OK Я просто меняю дату, но когда я нажимаю Обновить, значение DateTime всегда равно DateTime.Now. В EditingInline_Update параметр «рабочий» изменил значение BrithDate на DateTime.Now ... значение, которое я изменил, нигде.

Я читал где-то, что это может быть проблемой формирования культуры, но я сделал именно так, как они сказали: Создал DateModelBinder и зарегистрировал его в global.asax, но при отладке переданное значение - DateTime.Now ... он уже изменился. У Web.config есть Я изменил текущую культуру потока и UIculture, изменил kendo.culture, проверил в отладке, и все кажется правильным. Я даже поставить яваскрипт валидатора в редакторе:

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

это возвращает истину, и здесь я могу увидеть дату, я хочу изменить, но когда иду к ModelBinder это как-то меняет в DateTime.Now

I «Прошу прощения за долгое время, но это сводит меня с ума, я не знаю, является ли это ошибкой для коллекций внутри коллекций или если есть что-то еще, что я пропустил. Thanx заблаговременно

+0

Я только что начал использовать EditorTemplates для сетки Kendo. Я обнаружил, что добавление [UIHint = "DateField"] в вашу модель для DateFields, а затем и добавление редактора в «~/Shared/EditorTemplates/DateField» даст рендеринг вашего элемента управления в сетке. –

+0

Thanx Irb, я пробовал это раньше, и это не сработало, но я сделал это снова с самого начала, и теперь это сработало :). Я создавал редактор для каждого атрибута, но теперь я делаю один для каждого типа данных. Единственное, что не работает, - это попытаться разобрать дату в привязке к модели, потому что в строке с попыткой создания значения было время, поэтому я снова настроил код для синтаксического анализа со временем, хотя мне это не нужно. Thanx снова за предложение – user2493175

+0

https://kendoeditortemplate.codeplex.com/ –

ответ

0

У меня есть сетка kendo-ui MVC в одном из моих проектов, и она отлично работает с датой в режиме редактирования. Я заметил, что отличается от вашего кода тем, что я не писал никаких атрибутов свойства 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> 

Я хотел бы предложить вам попробовать следующее:

  • Удалить атрибуты в модели, чтобы убедиться в том, что они «не вызывает никаких проблем. Вы можете добавить их позже, когда все будет работать.
  • Попробуйте указать другой формат даты или формат даты. Если вы укажете один формат, и браузер пользователя захочет отобразить его в другом формате, вы можете столкнуться с проблемами.