【问题标题】:Kendo DataSource How to define a Model.Id when using DataTableKendo DataSource 使用 DataTable 时如何定义 Model.Id
【发布时间】:2013-09-10 20:13:25
【问题描述】:

在@(Html.Kendo().Grid(Model)中定义DataSource时,我已经成功使用了

.DataSource( dataSource => .Ajax( ).Model( model => model.Id( m => m.PROPERTY ) ) )

其中 PROPERTY 是模型对象的属性。如果 Model 是 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。如果没有人知道如何做,您可能只需要在 JavaScript 中定义它,而不是使用 MVC 帮助器。
  • @CodingWithSpike,你能给我指个样本吗?
  • 在纯 JavaScript 中,如果您想转换为 JS 而不是 MVC 助手,您可以设置 new kendo.data.DataSource({ schema: { model: { id: "PrimaryKey" } } });,最简单的做法是使用一次 MVC 助手,在浏览器中查看页面,然后复制/粘贴生成的 JS 代码。然后用生成的 JS 替换你的 MVC helper razor 代码。

标签: kendo-ui kendo-grid kendo-asp.net-mvc


【解决方案1】:

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

我们的一个 sn-p 是这样的:

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

【讨论】:

  • 你编辑你的数据吗?尽管展示如何在网格中使用 DataTable 很有用,但这不是问题所在。问题是如何设置 Model.Id。我提到了让更新命中的麻烦;如果我说过,如果没有 Model.Id,如果你指定“可编辑”,我会更清楚,你会得到“没有指定 DataSource 模型 ID 属性。”
  • 我们确实编辑了网格中包含的数据,但不是内联的。我们在弹出的剑道窗口中对其进行编辑。但要做到这一点,它必须知道选择并且我们没有明确地设置它......它只是神奇地发生了。您正在尝试内联编辑它?
  • 在定义 Grid 时,我们定义 .Editable( e => e.Mode(GridEditMode.Popup).TemplateName( "OurTemplate")...它为我们提供了一个弹出式编辑器。你这样做不同吗?当我们点击提交时,我们的更新控制器操作不会命中,除非我们定义了一个自定义类(其属性与 DataColumns 匹配)作为它的第二个参数类型(我知道,这违背了目的)。如果我可能会问,您的 Update 方法的签名是什么样的?
  • 我正在使用 Kendo UI (2013.2.918),并且还尝试将网格绑定到 System.Data.DataTable。我遇到的一个问题是我的 T-SQL 语句返回列名中带有空格的列。这并不违反 DataTable .. 它受支持.. 但我认为 Kendo 的 Grid 可能不支持它... 我收到 rowtemplate 错误。此外,在上面的代码 sn-p 中 - 我在智能感知中没有看到任何提示在 .DataSource(dataSource => dataSource .... ) 中定义 .Model
  • 我发现我必须创建自己的 ClientRowTemplate 才能使 DataColumns 的 ColumnNames 包含空格才能工作。此外,对于我的 KendoUI 版本,DataSource->Model 现在位于 DataSource->Server->Model
【解决方案2】:

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

首先,为了编辑,我必须设置一个 Model.Id,这是我最初的问题。答案很简单,model.Id( "KEY_COLUMN_NAME" ) 在 .DataSource.Model 方法中。但是,这还不足以解决更新不发生的问题。 Telerik Support 建议我需要定义一个自定义数据对象 (POCO),该对象具有与 DataTable 具有列的所有相同属性。该 POCO 成为更新的类型

public ActionResult MyUpdate( [DataSourceRequest] DataSourceRequest _request, MyPOCO _data ){...}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-08
    • 1970-01-01
    • 1970-01-01
    • 2014-10-01
    • 2010-12-17
    • 2014-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多