2013-06-21 4 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") 
) 
같은 무언가가를

모델은 모든 속성과 datetimes로 잘됩니다. 문제 : model.Foundations [0] .Workers []. BirthDate에 유효한 날짜가 있지만 템플릿 편집기에서 minvalue 모델과 함께 datetime을 제공합니다.

열을 편집 할 때 표시되는 값은 15-03-2006 대신 01-01-0001과 같습니다. OK 날짜 만 변경하지만 업데이트를 클릭하면 DateTime 값은 항상 DateTime.Now입니다. EditingInline_Update에서 'worker'매개 변수가 BrithDate를 DateTime으로 변경했습니다. 이제 ... 변경 한 값이 없습니다.

어쨌든 이것은 문화를 형성하는 문화 일 수 있지만 정확히 말했듯이 나는 DateModelBinder를 만들고 global.asax에 등록했지만 디버그 중에 전달 된 값은 DateTime.Now ...입니다. 그것은 이미 바뀌 었습니다. Web.config에 이 있습니다. 스레드 현재 culture와 UIculture를 변경하고 kendo.culture를 변경하고 디버그를 체크하고 모든 것이 옳은 것 같습니다. 이 true를 반환하고 여기에 내가 변경하고자하는 날짜를 볼 수 있습니다

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

을하지만 어떻게 든

I DateTime.now에 변화 ModelBinder를가는 경우 : 난 편집기에서 자바 스크립트 유효성 검사기를 넣어 오랫동안 유감 스럽지만 미쳐 버렸습니다. 컬렉션에 컬렉션이 있거나 컬렉션에 놓친 버그가 있는지 알 수 없습니다. 미리 고지

+0

방금 ​​Kendo Grid 용 EditorTemplates를 사용하기 시작했습니다. 나는 당신의 모델에서 DateFields를위한 [UIHint = "DateField"]를 추가하고 "~/Shared/EditorTemplates/DateField"에 편집기를 추가하면 그리드에서 컨트롤의 렌더링을 얻을 수 있다는 것을 알게되었습니다. –

+0

고맙습니다. Irb, 이전에 시도했지만 작동하지 않았지만 처음부터 다시 시도했지만 지금은 작동했습니다. :) 각 속성에 대한 편집기를 만들었지 만 지금은 각 데이터 유형에 대해 편집기를 만들고 있습니다. 작동하지 않는 유일한 방법은 시도한 값 문자열에 시간이 있기 때문에 모델 바인더에서 날짜를 파싱하려고 했으므로 시간이 필요하지는 않지만 코드를 다시 파싱했습니다. 고맙다는 제안을 다시 – 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"); 

와, 코드 당신이 내 모델은 단순히이처럼 보였다 광산을 귀하의 것으로 교체 할 때 테스트했을 때 제공되는 것이 좋습니다.

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

나는 다음과 같은 시도 제안 :

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

는 나뿐만 아니라 다음 코드를 추가 한 문화 문제를 처리하려면

  • 제거가 있는지 확인하기 위해 모델의 속성들은 어떤 문제도 일으키지 않습니다. 나중에 모두 작동 할 때 추가 할 수 있습니다.
  • 다른 날짜 형식을 지정하거나 날짜 형식을 지정하지하십시오. 하나의 형식을 지정하고 사용자 브라우저가 다른 형식으로 렌더링하려는 경우 문제가 발생할 수 있습니다.
관련 문제