2013-07-05 26 views
6

Tôi gặp sự cố trong đó thuộc tính của mô hình không được cập nhật chính xác khi gửi đến bộ điều khiển của tôi từ lưới Kendo. Mô hình này trông như thế này:Mô hình Lưới Kendo với thuộc tính IEnumerable không cập nhật chính xác sau khi Tạo/Cập nhật khi sử dụng liên kết AJAX

public class ReleaseNotesModel 
{ 
    public int NoteID { get; set; } 
    public int ReleaseID { get; set; } 
    public List<TranslationModel> ReleaseNoteTranslations { get; set; } 
    public ReleaseNoteType ItemType { get; set; } 
} 
public class TranslationModel 
{ 
    public int TranslationID { get; set; } 
    public string Translation { get; set; } 
    public int LanguageID { get; set; } 
    public int ItemID { get; set; } 
} 

Đây là lưới trong quan điểm của tôi:

@(Html.Kendo().Grid<ReleaseNotesModel>() 
    .Name("Grid") 
    .Columns(columns => 
    { 
     columns.Bound(m => m.ItemType).Width(140); 
     columns.Bound(m => m.Description); 
     columns.Command(command => 
      { 
       command.Edit(); 
       command.Destroy(); 
      }).Width(170); 
    }) 
    .ToolBar(toolbar => toolbar.Create()) 
    .Editable(editable => editable 
     .Mode(GridEditMode.PopUp) 
     .TemplateName("ReleaseNoteTemplate") 
     .Window(w => w.Width(620)) 
     .DisplayDeleteConfirmation(true) 
    ) 
    .Pageable() 
    .Sortable() 
    .Scrollable() 
    .Filterable() 
    .DataSource(dataSource => dataSource 
     .Ajax() 
     .ServerOperation(false) 
     //.Server() 
     .Events(e => e.Error("grid_error")) 
     .Model(model => 
     { 
      model.Id(m => m.NoteID); 
      model.Field(m => m.ReleaseID).DefaultValue(Model.ReleaseID); 
      model.Field(m => m.ItemType).DefaultValue(ReleaseNoteType.NewFeature); 
      //defaultTranslationsList is a List<TranslationModel> with two empty objects in it 
      model.Field(m => m.ReleaseNoteTranslations).DefaultValue(defaultTranslationsList); 
     }) 
     .PageSize(5) 
     .Read(read => read.Action("GetNotes", "ReleaseNotes", new { releaseID = Model.ReleaseID })) 
     .Create(create => create.Action("AddNote", "ReleaseNotes")) 
     .Update(update => update.Action("EditNote", "ReleaseNotes")) 
     .Destroy(destroy => destroy.Action("DeleteNote", "ReleaseNotes")) 
    ) 
) 

Vì vậy, cụ thể hơn, vấn đề tôi đang gặp là trong hành động điều khiển của tôi:

public async Task<ActionResult> EditNote(ReleaseNotesModel model) 

model.ReleaseNoteTranslations luôn chứa hai đối tượng trống (thuộc tính là null hoặc 0), tức là giá trị mặc định mà tôi đặt cho thuộc tính này. Nếu tôi không đặt giá trị mặc định, thì tôi sẽ không có bất kỳ trường nào để chỉnh sửa cho thuộc tính này trong trình chỉnh sửa cửa sổ bật lên. Tất cả các thuộc tính khác được cập nhật như mong đợi.

Lỗi của tôi là nếu tôi sử dụng ràng buộc máy chủ thay vì AJAX, thì tất cả dữ liệu được nhận chính xác. Vì vậy, tôi đã quyết định để kiểm tra các dữ liệu trong tiêu đề yêu cầu được gửi trong cả hai trường hợp:

// Using server binding 
ReleaseID:300 
NoteID:886 
ItemType:1 
ReleaseNoteTranslations[0].ItemID:886 
ReleaseNoteTranslations[0].LanguageID:1 
ReleaseNoteTranslations[0].TranslationID:869 
ReleaseNoteTranslations[0].Translation:The module is now released! 
ReleaseNoteTranslations[1].ItemID:886 
ReleaseNoteTranslations[1].LanguageID:2 
ReleaseNoteTranslations[1].TranslationID:870 
ReleaseNoteTranslations[1].Translation:Le module est maintenant disponible! 
NoteID:886 

// Using AJAX binding 
sort: 
group: 
filter: 
NoteID:886 
ReleaseID:300 
ReleaseNoteTranslations[0][TranslationID]:869 
ReleaseNoteTranslations[0][Translation]:The module is now released! 
ReleaseNoteTranslations[0][LanguageID]:1 
ReleaseNoteTranslations[0][ItemID]:886 
ReleaseNoteTranslations[1][TranslationID]:870 
ReleaseNoteTranslations[1][Translation]:Le module est maintenant disponible! 
ReleaseNoteTranslations[1][LanguageID]:2 
ReleaseNoteTranslations[1][ItemID]:886 
ItemType:1 

Bây giờ những gì tôi nhận thấy đầu tiên ở đây là cú pháp của objectName[index].PropertyName vs objectName[index][PropertyName]

Tôi tự hỏi nếu điều này có thể là nguyên nhân gây ra vấn đề của tôi, và nếu vậy, có cách nào để tôi đi và trực tiếp thao tác dữ liệu được gửi để sửa chữa nó không? Đây có phải là một lỗi trong cách Kendo Grid gửi dữ liệu thông qua Ajax ràng buộc?

Dù bằng cách nào, bất kỳ trợ giúp nào cũng sẽ được đánh giá cao!

+0

Bạn có thể tạo một lưới khác bên trong trình chỉnh sửa bật lên? và lưu tất cả 'TranslationModel' cùng với' ReleaseNotesModel' cùng một lúc? Tôi đang gặp vấn đề để làm như vậy. – Akbari

+1

Thực ra tôi chỉ hiển thị danh sách các phần tử văn bản trong trình chỉnh sửa cửa sổ bật lên, tôi chưa bao giờ thử làm việc đó với lưới. – Alejo

Trả lời

13

Vì vậy, trong trường hợp bất cứ ai tình cờ về vấn đề này trong thời gian tới, tôi đã liên lạc với hỗ trợ Telerik, người đã giải thích với tôi rằng:

DataSource hỗ trợ các loại chỉ có giá trị và sẽ không sắp đặt từng mảng trong các định dạng đó là dự kiến ​​bởi chất kết dính mô hình.

Họ cũng cung cấp cho tôi giải pháp thay thế bằng cách sử dụng yêu cầu Chức năng dữ liệu để gọi hàm JavaScript chuyển đổi dữ liệu thành định dạng chính xác.

Trong giao diện, thay đổi các chức năng theo yêu cầu bằng cách xác định tên của JavaScript hàm nào để gọi:

.Create(create => create.Action("AddNote", "ReleaseNotes").Data("serialize")) 

Và sau đó thêm vào các chức năng mà sẽ làm việc chuyển đổi:

function serialize(data) { 
    for (var property in data) { 
     if ($.isArray(data[property])) { 
      serializeArray(property, data[property], data); 
     } 
    } 
} 
function serializeArray(prefix, array, result) { 
    for (var i = 0; i < array.length; i++) { 
     for (var property in array[i]) { 
      result[prefix + "[" + i + "]." + property] = array[i][property]; 
     } 
    } 
} 
+0

Cảm ơn bạn rất nhiều. Tôi đã tìm kiếm câu trả lời cả ngày. Điều đó là vậy đó. – user906573

+0

Tôi có thêm một đối tượng bên trong trong đối tượng dữ liệu của mình .. làm cách nào tôi có thể áp dụng cho lưới của mình? –

0

Một vấn đề có thể là kendo.aspnet.mvc.js không được đưa vào dự án. Nó xuất hiện để làm thủ thuật serialization khi bao gồm.

+0

Tôi thực sự đã có kịch bản đó bao gồm toàn bộ thời gian, chỉ thêm serialization thủ công cố định vấn đề cho tôi. – Alejo

0

Điều mà tôi nhận thấy là bạn cần phải thêm nếu điều kiện là bạn không cần phải sắp xếp nếu số là 1, chỉ một mục hoạt động tốt mà không cần tuần tự hóa

Các vấn đề liên quan