ClientDetailTemplate中包含客户端模板未定义错误

时间:2014-07-03 17:46:26

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

我正在使用一个包含ClientDetailTemplate的Kendo Grid,其中包含另一个Grid。内部(子)网格包含使用ClientTemplate的列。

ClientTemplate包含一个Kendo DropDownList。

问题是ClientTemplate(下拉列表)未被识别 - 我收到“未定义”错误,因此细节区域无法显示。

但是,如果我从父网格的细节区域拉出内部网格并将子网格放入它自己的div(与父网格分开),那么它可以完美地工作。因此,在父网格的客户端详细信息模板中包含列客户端模板的网格导致其失败存在一些问题。

以下是父网格的样子:

<div class="row">
@(Html.Kendo().Grid<Rep.Models.BuildingViewModel>()

                  .Name("BuildingValidationGrid")
                  .Columns(columns =>
                  {
                      columns.Bound(b => b.BuildingName);
                      columns.Bound(b => b.Region);
                      columns.Bound(b => b.City);
                      columns.Bound(b => b.Country);
                      columns.Bound(b => b.BuildingStatus);
                      columns.Bound(b => b.DateLastUploaded).Format("{0:dd-MMM-yyyy}");
                  })
                  .HtmlAttributes(new { style = "height: 500px;" })
                  .Sortable()
                  .Scrollable()
                  .Groupable()
                  .ColumnMenu()
                  .Selectable()
                  .Resizable(resize => resize.Columns(true))
                  .ClientDetailTemplateId("plan_client_template")
                  .Pageable(pageable => pageable
                      .Refresh(true)
                      .PageSizes(true)
                      .ButtonCount(5))
                    .Filterable(filterable => filterable
                        .Extra(false)
                        .Operators(operators => operators
                            .ForString(str => str.Clear()
                                .StartsWith("Starts with")
                                .IsEqualTo("Is equal to")
                                .IsNotEqualTo("Is not equal to")
                            ))
                        )
                  .Events(events => events.Change("onChange"))
                  .DataSource(datasource => datasource
                      .Ajax()
                          .Read(read => read.Action("BuildingsForValidation_Read", "Plan"))
                      .PageSize(100)
                      .ServerOperation(true)

                  )
)

请注意客户端详细信息模板“plan_client_template”。

plan_client_template声明为:

<script id="plan_client_template" type="text/kendo-tmpl">

@(Html.Kendo().Grid<Rep.Models.BuildingChangeValidationViewModel>()
      .Name("CVGrid")
      .Scrollable()
      .Selectable()
      .Editable(editable => editable.Mode(GridEditMode.InLine))
      .Columns(columns =>
      {
          columns.Bound(b => b.Field);
          columns.Bound(b => b.OldValue);
          columns.Bound(b => b.NewValue);
          columns.Bound(b => b.DateImported).Format("{0:dd-MMM-yyyy}");
          columns.Bound(b => b.BuildingChangeValidationStatusType).ClientTemplate("#=BuildingChangeValidationStatusType.Value#").Width(250);
          columns.Command(command => command.Custom("Update").Click("updateValidation"));
          columns.Command(command => { command.Edit(); }).Width(172);
      })
      .DataSource(dataSource => dataSource
          .Ajax()
            .Model(model =>
            {
                model.Id(b => b.BuildingId);
                model.Field(b => b.BuildingChangeValidationStatusType).DefaultValue(
                    ViewData["defaultBuildingChangeValidationStatuses"] as Rep.Common.LookupItem);
            })
          .PageSize(5)
        .Read(read => read.Action("BuildingValidations_Read", "Plan", new { buildingId = 0 }))
        .Update(update => update.Action("BuildingValidations_Update", "Plan"))

      )
      .ToClientTemplate()
)

请注意包含ClientTemplate的列“BuildingChangeValidationStatusType”。

BuildingChangeValidationStatusType客户端模板定义为:

@(Html.Kendo().DropDownList()
.Name("BuildingChangeValidationStatusType") // Name of the widget should be the same as the name of the property
.DataValueField("Id") 
.DataTextField("Value")
    .DataSource(
        source => source.Read(read =>
                read.Action("BuildingValidationLookups_Read", "Plan").Data("getBuildingId")
         )
         .ServerFiltering(true)
    )
    .SelectedIndex(0))

同样,有趣的是,如果我从父网格的客户端详细信息区域创建网格名称“CVGrid”并进入它自己的div,它就可以工作。

对于发生了什么以及为什么没有看到客户端模板列的任何想法?

TIA!

1 个答案:

答案 0 :(得分:9)

发生这种情况的原因是主网格正在尝试解析子网格中的模板。由于这是子网格,因此必须在模板语法中使用哈希标记,例如

columns.Bound(b => b.BuildingChangeValidationStatusType).ClientTemplate("\\#=BuildingChangeValidationStatusType.Value\\#");