kendo 具有空 ID 行的自定义数据源的 mvc 网格

kendo mvc grid with a custom datasource that has null id rows

我想用我对更改数据源没有发言权的声明来打开这个问题,这是数据库中的一个函数,也在其他地方使用。

我有一个 kendo 网格,我正在从这样的视图模型中加载它:

 var data = db.Database.SqlQuery<OdometerLogsViewModel>($@"
            SELECT ID, OrderNum, Carrier, Driver, Truck, StartTime, EndTime, StartOdometer, EndOdometer, Mileage, Type, Locked
            FROM dbo.fnMileageLog(isnull('{StartDate}', getdate()), coalesce('{EndDate}', '{StartDate}', getdate()), {filterCarrierID}, {filterDriverID}, {filterTruckID}) ml
            WHERE ('{filterType}' LIKE 'Both' OR ml.Type LIKE '{filterType}%')
            AND ({id} = 0 or {id} = ml.ID)
            ORDER BY Truck, StartTime DESC 

这可以很好地加载到网格中。但是我注意到当我的备用行(代表卡车的“死头”因此没有订单号)存在(未过滤掉)时,编辑一行需要很长时间。 经过检查,事实证明,每次我为所有空 ID 条目点击保存时,网格都试图“创建”一个新记录。我测试了一页上的 43 个。我在网格数据源 requestStart 事件中验证了这一点。显然,在那种情况下,您无法阻止默认。我如何防止网格这样做?我不反对 hacky 方法。

我联系了 Telerik,他们告诉我 Telerik 在内部对数据集的每个模型实例(每一行)执行 IsNew() 检查。由于我的交替行不可编辑,只能用于识别空行驶里程,解决方案是简单地修改 sql 查询以使用假值填充空 ID。我们选择-1.

 var data = db.Database.SqlQuery<OdometerLogsViewModel>($@"
        SELECT CASE WHEN ID IS NULL THEN -1 ELSE ID END ID , OrderNum, Carrier, Driver, Truck, StartTime, EndTime, StartOdometer, EndOdometer, Mileage, Type, Locked
        FROM dbo.fnMileageLog(isnull('{StartDate}', getdate()), coalesce('{EndDate}', '{StartDate}', getdate()), {filterCarrierID}, {filterDriverID}, {filterTruckID}) ml
        WHERE ('{filterType}' LIKE 'Both' OR ml.Type LIKE '{filterType}%')
        AND ({id} = 0 or {id} = ml.ID)
        ORDER BY Truck, StartTime DESC