如何使用两个表格EF正确绑定和填充Kendo UI网格?

时间:2016-10-25 14:43:02

标签: c# asp.net entity-framework kendo-grid

我的项目有两个主要问题阻止我能够执行正常的基本Kendo UI gridbind。 1.我没有完全访问所需的SQL数据(我无法创建视图)2。其中一个字段非常大(字段会重载ViewModel)。

我能够让我的网格工作,但我觉得有更好的方法来完成任务。从本质上讲,我的问题是我只能将网格绑定到一个DB表。为了传递这个,我绑定到外键字段并使用clientTemplate来填充读取的数据,但我觉得应该有一种更直接的方法来将字段绑定到数据。我的读取数据是来自EF的Linq加入的actionresult,转换为JSON。 这是我的代码,如果有人可以提出建议。表2中的D_Type是我试图直接绑定到列的内容:

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

1 个答案:

答案 0 :(得分:0)

不要将网格绑定到ProjectName.Models.Table1。

相反,将它绑定到ViewModel,该ViewModel包含Table1中的字段和Table2中要在Grid中显示的字段,即

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方法返回你从LINQ查询而不是Table1s列表中构造的这些ViewModel的列表。

即。编写一个LINQ查询,返回您想要的确切数据(Table1中的数据通过Table1.TypeID与Table2.D_Type连接),并返回您创建的自定义ViewModel的结果集,以保存查询中的数据,然后将网格绑定到模型而不是&#34; raw&#34;表1模型。