2016-10-25 3 views
0

В моем проекте есть две основные проблемы, которые мешают мне сделать нормальный основной сетевой интерфейс Kendo UI. 1. У меня нет полного доступа к требуемым данным SQL (я не могу создать представление). 2. Одно из полей невероятно велико (поле перегружает ViewModel).Как правильно привязать и заполнить сетку пользовательского интерфейса Kendo двумя таблицами EF?

Я смог заставить свою сетку работать, но я чувствую, что есть лучший способ выполнить задачу. Моя проблема, по сути, заключается в том, что я могу только представить gridbind для одной таблицы БД. Чтобы получить это, я привязался к полю внешнего ключа и использовал clientTemplate для заполнения данных из чтения, но я чувствую, что должен быть более прямой способ привязать поле к данным. Мои прочитанные данные - это actionresult Linq join из EF, преобразованный в JSON. Вот мой код, если кто-нибудь может сделать предложение. D_Type из таблицы 2, что я пытаюсь связать непосредственно с колонкой:

@(Html.Kendo().Grid<ProjectName.Models.Table1>() 
    .Name("grid") 
    .Scrollable() 
    .ColumnMenu() 
    .Reorderable(reorder => reorder.Columns(true)) 
    .Columns(columns => 
    { 

     columns.Bound(c => c.P_Name); 
     columns.Bound(c => c.E_Name); 
     //Cannot be directly bound to a column because it is part of Table2 table 
     columns.Bound(c => c.TypeId).Title("Type").ClientTemplate("#= D_Type #").Filterable(false);    
     columns.Command(command => command.Custom("Details").Click("showDetails")).Title("Results").Width(80); 
     columns.Bound(c => c.Destination); 
     columns.Bound(c => c.Location); 
     columns.Bound(c => c.Version); 
     columns.Bound(c => c.StartDt); 
     columns.Bound(c => c.EndDt); 
     columns.Bound(c => c.StartDt).Title("Duration").ClientTemplate("#: calcDuration(StartDt, EndDt) #").Sortable(false).Filterable(false); 
     columns.Bound(c => c.); 
     columns.Bound(c => c.MiscNotes).ClientTemplate("#: errorDisplay(ResultObject) # ").Sortable(false).Filterable(false); 


    }) 
    //Style dictates full grid height 
    .HtmlAttributes(new { style = "height: 725px;" }) 
    .Filterable() 
    .Resizable(resize => resize.Columns(true)) 
    .Sortable(sortable => sortable 
     .AllowUnsort(true) 
     .SortMode(GridSortMode.SingleColumn)) 
    .Pageable(pageable => pageable 
     .Refresh(false) 
     .PageSizes(true) 
     .ButtonCount(5)) 
    .Events(e => e.DataBound("onDataBound")) 
    .DataSource(dataSource => dataSource 
     .Ajax() 
     .Sort(sort => sort.Add("StartDt").Descending()) 
     .Read(read => read.Action("Project_Read", "Grid")) 
     .PageSize(20) 
     .ServerOperation(true) 
    ) 
    ) 

ответ

0

Не отдавайте вашу сетку к ProjectName.Models.Table1.

Вместо этого привязать его к ViewModel, который содержит поле из Table1 и полей из Table2, который вы хотите отобразить в сетке, т.е.

public class SpecificGridViewModel 
{ 
    public string P_Name { get; set; } 
    // Other fields you want from Table1 
    // ... 
    // PLUS the field(s) you want from the other, joined table. 
    public string D_Type { get; set; } 
} 

Тогда у вас есть метод Project_Read возвращает список этих ViewModels, которые вы создали из своего запроса LINQ вместо списка Table1s.

т. Е. Написать запрос LINQ, который возвращает точные данные, которые вы хотите (данные из таблицы 1, соединенные с Table2.D_Type через Table1.TypeID), и вернуть набор результатов пользовательской ViewModel, который вы создаете для хранения данных из запроса, а затем привяжите свою сетку к этой модели вместо «сырой» модели Table1.

+0

Это работает 99% времени, но, к сожалению, я получаю ошибку System.OutofMemory, делая это так из-за размера одного из полей. – fdsafdsafdsafdsafs

+0

Затем продолжайте делать это так, как вы это делаете (с извлечением и показом D_Type по запросу) ... не так много, что сетка может сделать, если размер одного из ваших полей будет таким большим. Я также сомневаюсь в необходимости отображения таких данных (в частности, не для вас, я также задаю вопрос пользователям, которым требуется 1200-страничный отчет, который они никогда не будут читать и просто хотят получить дамп XLSX) ... если компьютер не может обработать это комфортно, человек действительно собирается обрабатывать/делать что-либо значимое с данными на экране или их глазу на глазах? –

+0

Повторное чтение вашего решения позволило мне увидеть, где моя ошибка. Я поместил ViewModel в ActionResult Read, а не как отдельную модель. Вот почему он посылал слишком много данных на виртуальную машину. Иногда вам просто нужно сделать шаг назад и снова прочитать вещи. Спасибо. – fdsafdsafdsafdsafs

Смежные вопросы