2012-11-21 62 views
1

我有一個使用自定義對象的顯示模板的Kendo網格。我已經實現了IComparable來允許分組和排序,但我不知道我需要做些什麼才能使過濾工作。實際上,當我單擊列的過濾器按鈕時,它會有一個空白下拉列表,而不是通常的「包含,開頭,等於」以及通常顯示的這些選項。我正在使用ToDataSourceResult來操縱結果。在自定義對象上過濾Kendo網格

模型:

public class LEAProgramMap 
{ 
    public string entity_program { get; set; } 
    [UIHint("ProgramEditor")] 
    public ProgramDDL program_desc { get; set; } 
} 

下拉:

public class ProgramDDL : IComparable 
{ 
    public short program_id { get; set; } 
    public string entity_program { get; set; } 
    public string program_desc { get; set; } 
    public int CompareTo(object obj) 
    { 
     if (obj is ProgramDDL) 
     { 
      ProgramDDL rev2 = (ProgramDDL)obj; 
      return program_desc.CompareTo(rev2.program_desc); 
     } 
     else 
      throw new ArgumentException("Object is not a ProgramDDL"); 
    } 
} 

和視圖:

@model IEnumerable<Datamart.Models.ViewModels.LEAProgramMap> 

@{ 
    ViewBag.Title = "CreateProgramMap"; 
    var snapshot = Session["snapshot_id"] ?? Request.Params["snapshot_id"]; 
} 

<h2>CreateProgramMap</h2> 
@(Html.Kendo().Grid(Model) 
.Name("Programs") 
.Columns(cols => 
    { 
     cols.Bound(p => p.entity_program).ClientTemplate("#=entity_program#"); 
     cols.Bound(p => p.program_desc).ClientTemplate("#=program_desc.program_desc#"); 
    }) 
.ToolBar(commands => 
    { 
     commands.Save(); 
    }) 
.Editable(edit => edit.Enabled(true).Mode(GridEditMode.InCell)) 
.DataSource(ds => ds 
      .Ajax() 
      .Model(model => 
       { 
        model.Id(p => p.entity_program); 
        model.Field(p => p.entity_program).Editable(false); 

       }) 
    // Configure RU --> 
       .Read(read => read.Action("Program_Read", "Draft").Data("additionalData")) 
       .Update(update => update.Action("Program_Update", "Draft").Data("additionalData")) 
    //.ServerOperation(false) 
       .Batch(true) 
       .Events(events => events 
        //.Change("onChange") 
        .Error("onError") 
        ) 
       ) 
     // <-- Configure RU 
     .Pageable(page => page.PageSizes(new int[] { 10, 25, 50, 100 }).Enabled(true)) 
     .Groupable(group => group.Enabled(true)) 
     .Filterable(filter => filter.Enabled(true).Extra(true)) 
     .Sortable(sort => sort.Enabled(true).SortMode(GridSortMode.SingleColumn).AllowUnsort(true)) 
     .Navigatable(nav => nav.Enabled(true)) 
     .Resizable(resizing => resizing.Columns(true)) 
     .Reorderable(reorder => reorder.Columns(true)) 
      ) 

<script> 
function additionalData() { 
    return { 
     snapshot_id: "@snapshot" 
    }; 
} 

function onError(e, status) { 
    if (e.errors) { 
     var message = "The following errors have occurred:\n"; 

     $.each(e.errors, function (key, value) { 
      if (value.errors) { 
       message += value.errors.join("\n"); 
      } 
     }); 

     alert(message); 
    } 
} 

function onChange() { 
    var grid = $("#Programs").data("kendoGrid"); 

    grid.dataSource.read(); 
} 
</script> 

回答

1

不幸劍道UI不支持類成分/含視圖模型的複雜對象,您的視圖模型需要完全平坦以避免意外行爲。所以你的班級應該是這樣的。

public class LEAProgramMap 
{ 
    public string entity_program { get; set; } 
    public short program_id { get; set; } 
    public string entity_program { get; set; } 
    public string program_desc { get; set; } 
} 
+0

所以我可以使用我當前的查看模型,但只是過濾?我將不得不添加一個功能請求 - 這似乎很奇怪,因爲我認爲如果它是一個重要功能,我可以在自定義解析器中實現它們。如果客戶認爲它足夠重要,那麼我現在可能只是在網格之外添加一個搜索,然後在發佈更優雅的解決方案後再回去搜索。 – Elsimer

+0

當我第一次偶然發現Kendo UI視圖模型必須是完全平坦的時候,當我嘗試應用排序時,它似乎能夠正確綁定模型,以便它可以顯示數據。當你試圖用DataSourceResult(過濾,排序,分組等)做任何事情時,它似乎會給出意想不到的結果。 – SimonGates

+0

雖然在實現IComparable後,我能夠在Kendo中對複雜的類進行排序。分組也行得通 - 也許是因爲我在使用模板? – Elsimer