Kendo ui Kendo DataSource如何在使用DataTable时定义Model.Id

Kendo ui Kendo DataSource如何在使用DataTable时定义Model.Id,kendo-ui,kendo-grid,kendo-asp.net-mvc,Kendo Ui,Kendo Grid,Kendo Asp.net Mvc,在@(Html.Kendo().Grid(Model)中定义数据源时,我成功地使用了 .DataSource( dataSource => .Ajax( ).Model( model => model.Id( m => m.PROPERTY ) ) ) 其中PROPERTY是作为模型的对象的属性。如果模型是System.Data.DataTable,并且DataTable中的Id列是TableId,那么定义model.Id的正确语法是什么 换句话说,model.Id(m=>?

在@(Html.Kendo().Grid(Model)中定义数据源时,我成功地使用了

.DataSource( dataSource => .Ajax( ).Model( model => model.Id( m => m.PROPERTY ) ) )
其中PROPERTY是作为模型的对象的属性。如果模型是System.Data.DataTable,并且DataTable中的Id列是TableId,那么定义model.Id的正确语法是什么

换句话说,model.Id(m=>?)


我尝试了,
model.Id(m=>model.PrimaryKey)
,这似乎满足了设置model.Id的要求,但是更新操作(
.Update(Update=>Update.Action(“MyUpdateMethod”,“MyController”)
)没有命中,所以我认为一定还是有问题。

您可以绑定到DataTable。事实上,我们做了很多动态网格,DataTable是我们唯一的资源。不过绑定有点不同

我们其中一个人的一个片段是这样的:

@model System.Data.DataTable
@(Html.Kendo().Grid(Model)
    .Name("SomeGrid")
    .Columns(columns=>
      { 
          foreach(System.Data.DataColumn column in Model.Columns)
          {
              columns.Bound(column.ColumnName).Title(column.Caption).Width(200);
          }
       }
    )
    .Selectable(selectable=>selectable
       .Type(GridSelectionType.Row)
    )
    .DataSource(dataSource => dataSource
        .Ajax()
        .Model(model =>
             {
                 foreach(System.Data.DataColumn column in Model.Columns)
                 { 
                     model.Field(column.ColumnName,column.DataType);
                 }
             }
         )
         .Read(read=>Action("SomeMethod", "SomeController"))
         .PageSize(20)
     )

我有一个答案,虽然它不是很圆滑。它有几个部分

首先,为了编辑,我必须设置一个Model.Id,这是我最初的问题。答案很简单,
Model.Id(“KEY\u COLUMN\u NAME”)
在.DataSource.Model方法中。但是,这还不足以解决无法进行更新的问题。Telerik支持部门建议我需要定义一个自定义数据对象(POCO),该对象具有与DataTable中的列相同的所有属性。POCO将成为更新的类型

public ActionResult MyUpdate([DataSourceRequest]DataSourceRequest\u请求,MyPOCO\u数据){…}


然后,编辑器可以将DataRow列映射到POCO属性,然后MyUpdate就可以工作了。

我甚至不知道您可以将其绑定到DataTable。如果没有人知道如何绑定,您可能只需要在JavaScript中定义它,而不必使用MVC帮助程序。@CodingWithPike,您能给我指一个示例吗?在纯JavaScript中,您可以这样做set
newkendo.data.DataSource({schema:{model:{id:“PrimaryKey”}});
如果您想转换为JS而不是MVC helper,最简单的方法是使用MVC helper一次,在浏览器中查看页面,然后复制/粘贴生成的JS代码。然后用生成的JS替换MVC helper razor代码。您是否编辑数据?虽然显示DataTable在网格中的使用方式很有用,但这是n问题是。问题是如何设置Model.Id。我提到了在更新时遇到的问题;如果我说没有Model.Id,如果指定“可编辑”,则会得到“没有指定数据源模型Id属性”,我会更清楚我们确实编辑网格中包含的数据,但不是内联的。我们在弹出的剑道窗口中编辑它。但要做到这一点,它必须知道选择,而不是显式地设置它……这只是神奇地发生了。您正在尝试内联编辑它?在定义网格时,我们定义.Editable(e=>e.Mode(GridEditMode.popup)。TemplateName(“我们的模板”)…这为我们提供了一个弹出式编辑器。您有不同的做法吗?当我们点击Submit时,我们的控制器更新操作不会点击,除非我们定义了一个自定义类(其属性与DataColumns匹配)作为其第二个参数类型(我知道这与目的背道而驰)。如果我可以问一下,您的更新方法的签名是什么样子的?我正在使用剑道用户界面(2013.2.918)我还试图将网格绑定到System.Data.DataTable。我遇到的一个问题是,我的T-SQL语句返回列名中带有空格的列。这不会违反DataTable。它是受支持的。但我认为Kendo的网格可能不支持它。我得到了rowtemplate错误。此外,在上面的代码段中,我没有看到在我的intellisense中,在.DataSource(DataSource=>DataSource…)中定义.Model的任何提示下,我发现我必须创建自己的ClientRowTemplate,以使具有包含空格的列名的DataColumns工作。此外,对于我的KendoUI版本,DataSource->Model现在位于DataSource->Server->Model下