Group Paging is not working as expected when the Kendo UI Grid is populated from data deserialized from a file and multiple groups are defined.
Using the UI for ASP.NET Core Grid, populate it with a file, set GroupPaging to true, add more than one group, and set the default serialization:
builder.Services.AddControllersWithViews()
.AddJsonOptions(options =>
options.JsonSerializerOptions.PropertyNamingPolicy = null);@(Html.Kendo().Grid<MyViewModel>()
.Name("grid")
.Groupable()
.Scrollable(s=>s.Virtual(true))
.DataSource(dataSource=>dataSource
.Ajax()
.GroupPaging(true)
.PageSize(50)
.Read("ReadFromFile", "HomeController")
.Group(x=>
{
x.Add(y=>y.Group1);
x.Add(y=>y.Group2);
})
)
//...) With multiple groups, the follow error message will appear:
System.ArgumentNullException: Value cannot be null. (Parameter 'source')
at System.Linq.ThrowHelper.ThrowArgumentNullException(ExceptionArgument argument)
at Kendo.Mvc.Infrastructure.Group.InitializeSubgroups()
at SubgroupsGetter(Object )
at System.Text.Json.Serialization.Metadata.JsonPropertyInfo`1.GetMemberAndWriteJson(Object obj, WriteStack& state, Utf8JsonWriter writer)
at System.Text.Json.Serialization.Converters.ObjectDefaultConverter`1.OnTryWrite(Utf8JsonWriter writer, T value, JsonSerializerOptions options, WriteStack& state)
at System.Text.Json.Serialization.JsonConverter`1.TryWrite(Utf8JsonWriter writer, T& value, JsonSerializerOptions options, WriteStack& state)
at System.Text.Json.Serialization.JsonConverter`1.TryWriteAsObject(Utf8JsonWriter writer, Object value, JsonSerializerOptions options, WriteStack& state)
at System.Text.Json.Serialization.JsonConverter`1.TryWrite(Utf8JsonWriter writer, T& value, JsonSerializerOptions options, WriteStack& state)
at System.Text.Json.Serialization.Converters.IEnumerableConverter`1.OnWriteResume(Utf8JsonWriter writer, TCollection value, JsonSerializerOptions options, WriteStack& state)
at System.Text.Json.Serialization.JsonCollectionConverter`2.OnTryWrite(Utf8JsonWriter writer, TCollection value, JsonSerializerOptions options, WriteStack& state)
at System.Text.Json.Serialization.JsonConverter`1.TryWrite(Utf8JsonWriter writer, T& value, JsonSerializerOptions options, WriteStack& state)
at System.Text.Json.Serialization.Metadata.JsonPropertyInfo`1.GetMemberAndWriteJson(Object obj, WriteStack& state, Utf8JsonWriter writer)
at System.Text.Json.Serialization.Converters.ObjectDefaultConverter`1.OnTryWrite(Utf8JsonWriter writer, T value, JsonSerializerOptions options, WriteStack& state)
at System.Text.Json.Serialization.JsonConverter`1.TryWrite(Utf8JsonWriter writer, T& value, JsonSerializerOptions options, WriteStack& state)
at System.Text.Json.Serialization.JsonConverter`1.WriteCore(Utf8JsonWriter writer, T& value, JsonSerializerOptions options, WriteStack& state)
at System.Text.Json.Serialization.JsonConverter`1.WriteCoreAsObject(Utf8JsonWriter writer, Object value, JsonSerializerOptions options, WriteStack& state)
at System.Text.Json.JsonSerializer.WriteCore[TValue](JsonConverter jsonConverter, Utf8JsonWriter writer, TValue& value, JsonSerializerOptions options, WriteStack& state)
at System.Text.Json.JsonSerializer.WriteStreamAsync[TValue](Stream utf8Json, TValue value, JsonTypeInfo jsonTypeInfo, CancellationToken cancellationToken)
at System.Text.Json.JsonSerializer.WriteStreamAsync[TValue](Stream utf8Json, TValue value, JsonTypeInfo jsonTypeInfo, CancellationToken cancellationToken)
at System.Text.Json.JsonSerializer.WriteStreamAsync[TValue](Stream utf8Json, TValue value, JsonTypeInfo jsonTypeInfo, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Mvc.Infrastructure.SystemTextJsonResultExecutor.ExecuteAsync(ActionContext context, JsonResult result)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextResultFilterAsync>g__Awaited|30_0[TFilter,TFilterAsync](ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResultExecutedContextSealed context)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.ResultNext[TFilter,TFilterAsync](State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeResultFilters()
--- End of stack trace from previous location ---
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextResourceFilter>g__Awaited|25_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResourceExecutedContextSealed context)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeFilterPipelineAsync()
--- End of stack trace from previous location ---
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Logged|17_1(ResourceInvoker invoker)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Logged|17_1(ResourceInvoker invoker)
at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)
Server GroupPaging should work as expected with multiple groups and the default serialization that is delivered with ASP.NET Core. An example would be this live demo.
Use the Newtonsoft library to set the serialization options for the application:
builder.Services.AddControllersWithViews()
.AddNewtonsoftJson(options => options.SerializerSettings.ContractResolver = new Newtonsoft.Json.Serialization.DefaultContractResolver());
The second criterion DropDownList in the Filter Menu does not show records upon interaction:

The second criterion DropDownList in the Filter Menu should show records upon interaction:

If I put the Grid into a kendo-template for the TileLayout control, the ClientTemplate does not work properly. It only gets called once regardless of the number of items in the grid and the data is not being passed in.
This is my column definition:
columns.Bound(c => c.DocumentKey).Title(" ").ClientTemplate("#=CommandTemplate(data)#").Width(70);
And I am calling the .ToClientTemplate() on the Grid. Everything else work great except for this one issue.
I have not been able to find any other info, so what am I missing?
Tooltip produces inconsistent behavior upon hovering when the content is configured through the content client-side configuration.
For every second hover, the Tooltip does not display the element's content.
For every second hover, the Tooltip should display the element's content.
I have a model with configured Display and Required DataAnnotation.
However the TagHelper Grid doesn't serialize them because it is lacking a configuration property to bind to a Model like the HtmlHelper does:
@(Html.Kendo().Grid<Kendo.Mvc.Examples.Models.CustomValidationProductViewModel>()
.Name("grid")
...
)Can this capability be implemented for the TagHelper as well?
Expose the ability to specify an Edit Form Type mode for the Grid similar to the Telerik UI for ASP.NET AJAX control:
https://demos.telerik.com/aspnet-ajax/grid/examples/data-editing/edit-form-types/defaultcs.aspx
### Bug report
When the Grid group paging is enabled, and the Grid is grouped, when the user search through the built-in search panel, and expand a specified group, an infinite loop appears. The Grid sends Read requests, and the server returns empty "data" property.
### Reproduction of the problem
1) Create a Grid bound to remote data and enable the group paging feature.
2) Group the Grid by a specified column.
3) Enter a value in the Grid search panel (the grouped data is filtered).
4) Expand a specified group --> it causes an infinite loop.
5) Open the browser Network tab to review the Read requests.
A Dojo sample for reproduction: https://dojo.telerik.com/EsuQoQiP
### Expected/desired behavior
The grouped Grid data should be filtered through the search panel as expected.
### Environment
* **Kendo UI version: 2023.1.117
* **jQuery version: 1.12.4
* **Browser: [all]
Filtering a column bound to a complex object throws a JavaScript error.
This is a regression introduced with v 2023.1.117
Uncaught TypeError: Cannot convert undefined or null to object
at Function.keys (<anonymous>)
at x (kendo.all.js:313050:21)
at init._createForm (kendo.all.js:313050:21)
at init._init (kendo.all.js:313050:21)
at init._click (kendo.all.js:313050:21)
at HTMLAnchorElement.dispatch (jquery.min.js:3:12445)
at r.handle (jquery.min.js:3:9174)
JavaScript error is thrown and the filter menu is not generated.
Filtering should work as expected.
The TagHelper Grid's TagHelper is not correctly serialized and cannot be used to export hidden columns.
<columns>
<column field="Discontinued" hidden="true">
<exportable enabled="true" />
</column>
</columns>
The Grid TagHelper does not export hidden columns if the exportable TagHelper is enabled identically to the Kendo UI for jQuery Grid column exportable option.
The Grid TagHelper should be able to export hidden columns if the exportable TagHelper is enabled identically to the Kendo UI for jQuery Grid column exportable option.
Having a grid with a similar column setup will result in an error.
.Columns(columns =>
{
columns.Bound(p => p.UnitsInStock).HtmlAttributes(new { @class = "#: UnitsInStock == 39 ? 'test' : 'a' #" });
})
Having a grid with a similar column setup should not result in an error.
.Columns(columns =>
{
columns.Bound(p => p.UnitsInStock).HtmlAttributes(new { @class = "#: UnitsInStock == 39 ? 'test' : 'a' #" });
})
I have a grid where the editor button should not be with text so I added a class to the button like this:
@(Html.Kendo().Grid<...>()
.Name("...")
.Columns(columns =>
{
columns.Command(command => command.Edit()
.Text(" ")
.HtmlAttributes(new { @class = "grid-button-notext", title = "..." }));
})
.Editable(editable => editable.Mode(GridEditMode.PopUp)
.TemplateName("..."))
)but the HtmlAttributes are applied also to the two buttons on the popup editor
<div class="k-edit-buttons k-actions-end">
<button type="button" class="k-grid-update grid-button-notext k-button k-button-md k-rounded-md k-button-solid k-button-solid-primary" title="...">
<span class="k-icon k-i-check k-button-icon"></span>
<span class="k-button-text">Save</span>
</button>
<button type="button" class="k-grid-cancel grid-button-notext k-button k-button-md k-rounded-md k-button-solid k-button-solid-base" title="...">
<span class="k-icon k-i-cancel k-button-icon"></span>
<span class="k-button-text">Cancel</span>
</button>
</div>Expected behaviour:
the HtmlAttributes to be applied only to the grid button. And if needed to provide PopupButtonHtmlAttributes like you have for column: HtmlAttributes, HeaderAttributes, FooterAttributes
Expose configuration options for setting the options - Size, ThemeColor, FillMode and Rounded - of the Grid's command buttons and toolbar buttons, as possible for a simple Button component.
Adding a separate configuration for the Cancel command button would also be beneficial. For example:
.Columns(columns => {
columns.Bound(p => p.ProductName);
columns.Bound(p => p.UnitPrice).Width(140);
columns.Bound(p => p.UnitsInStock).Width(140);
columns.Bound(p => p.Discontinued).Width(100);
columns.Command(command => command.Destroy().ThemeColor(ThemeColor.Error)).Width(150);
})
.ToolBar(toolbar => {
toolbar.Create().ThemeColor(ThemeColor.Info).Size(ComponentSize.Large);
toolbar.Save().ThemeColor(ThemeColor.Success);
toolbar.Cancel().ThemeColor(ThemeColor.Warning);
})