Context / scenario
We run a large ASP.NET AJAX application with a fully custom, self-maintained CSS theme — we do not use any of Telerik's built-in skins. For this kind of setup we need complete control over every stylesheet that gets loaded into the page, both for consistency of our design system and to avoid unexpected CSS side effects or class-name collisions with resources we don't manage.
Issue
We found that fonticons.css is automatically and unconditionally injected by the Lightweight rendering path used by the controls (e.g. RadButton, RadTextBox, and other controls using the Lightweight render mode). This injection happens regardless of the EnableEmbeddedSkins and EnableEmbeddedBaseStylesheet settings, which normally let developers opt out of Telerik's embedded/base CSS resources. In other words, even with both of those settings disabled and no skin applied, fonticons.css is still loaded — there is currently no supported way to prevent it.
We raised this with Telerik support and it was confirmed internally: the fonticons.css injection is currently hard-wired into the Lightweight rendering path and is not gated by any existing configuration option.
Why this matters
EnableEmbeddedSkins / EnableEmbeddedBaseStylesheet = "nothing gets injected automatically" for teams running a fully custom theme.Feature request
Introduce a supported opt-out for the automatic fonticons.css injection in the Lightweight rendering path — for example, a new setting such as EnableFontIcons (page/control or global web.config level, consistent with how EnableEmbeddedSkins / EnableEmbeddedBaseStylesheet are already exposed) that lets developers explicitly disable this injection when they provide their own icon/font handling.
We understand from Telerik support that this is not a small, isolated change — it requires auditing and refactoring how style resources are declared and loaded across the whole control set (including some legacy resource-registration code) before a dedicated opt-out setting can be safely introduced, and that this carries a real risk of regressions if rushed. We're not expecting a quick fix; we're submitting this as a tracked feature request, as recommended by Telerik support, so it can be prioritized and voted on by other customers with the same fully-custom-theme use case.
Suggested acceptance criteria
fonticons.css injection specifically in Lightweight rendering mode.EnableEmbeddedSkins / EnableEmbeddedBaseStylesheet: when disabled, no font-icon CSS is emitted by the framework, leaving the developer fully responsible for providing equivalent styles if needed.Summary When a RadPane has Scrolling="Y" (or X/Both) and also has BorderWidth, BorderStyle, BorderColor set (either directly on the pane or via the parent RadSplitter's PanesBorderSize), the pane's inner scrollbar does not render/work correctly. The space reserved for the scrollbar remains in the layout, but the scrollbar itself is missing or non-functional, effectively making the pane's content unscrollable.
Steps to Reproduce
Expected behavior The pane's scrollbar should render correctly and remain functional regardless of BorderWidth/BorderStyle/BorderColor/PanesBorderSize settings.
Actual behavior Scrollbar space is reserved but the scrollbar is missing/non-functional when a border is applied to the pane.
Telerik UI for ASP.NTE AJAX nuget package adds ChartImage handler configs to Web.Config (system.web/httpHandlers and system.webServer/handlers) even though it does not support RadChart any more.
Also it seems to mess system.webServer/handlers configuration by adding remove actions for other Telerik handlers AFTER add actions.
system.web/httpHandlers before:
<httpHandlers> <add path="Telerik.Web.UI.SpellCheckHandler.axd" type="Telerik.Web.UI.SpellCheckHandler" verb="*" validate="false" /> <add path="Telerik.Web.UI.DialogHandler.aspx" type="Telerik.Web.UI.DialogHandler" verb="*" validate="false" /> <add path="Telerik.RadUploadProgressHandler.ashx" type="Telerik.Web.UI.RadUploadProgressHandler" verb="*" validate="false" /> <add path="Telerik.Web.UI.WebResource.axd" type="Telerik.Web.UI.WebResource" verb="*" validate="false" /> </httpHandlers>
system.web/httpHandlers after:
<httpHandlers> <add path="Telerik.Web.UI.SpellCheckHandler.axd" type="Telerik.Web.UI.SpellCheckHandler" verb="*" validate="false" /> <add path="Telerik.Web.UI.DialogHandler.aspx" type="Telerik.Web.UI.DialogHandler" verb="*" validate="false" /> <add path="Telerik.RadUploadProgressHandler.ashx" type="Telerik.Web.UI.RadUploadProgressHandler" verb="*" validate="false" /> <add path="Telerik.Web.UI.WebResource.axd" type="Telerik.Web.UI.WebResource" verb="*" validate="false" /> <add path="ChartImage.axd" type="Telerik.Web.UI.ChartHttpHandler" verb="*" validate="false" /></httpHandlers>
system.webServer/handlers before:
<handlers> <add name="Telerik_Web_UI_SpellCheckHandler_axd" path="Telerik.Web.UI.SpellCheckHandler.axd" type="Telerik.Web.UI.SpellCheckHandler" verb="*" preCondition="integratedMode" /> <add name="Telerik_Web_UI_DialogHandler_aspx" path="Telerik.Web.UI.DialogHandler.aspx" type="Telerik.Web.UI.DialogHandler" verb="*" preCondition="integratedMode" /> <add name="Telerik_RadUploadProgressHandler_ashx" path="Telerik.RadUploadProgressHandler.ashx" type="Telerik.Web.UI.RadUploadProgressHandler" verb="*" preCondition="integratedMode" /> <add name="Telerik_Web_UI_WebResource_axd" path="Telerik.Web.UI.WebResource.axd" type="Telerik.Web.UI.WebResource" verb="*" preCondition="integratedMode" /> </handlers>
system.webServer/handlers after:
<handlers> <add name="Telerik_Web_UI_SpellCheckHandler_axd" path="Telerik.Web.UI.SpellCheckHandler.axd" type="Telerik.Web.UI.SpellCheckHandler" verb="*" preCondition="integratedMode" /> <add name="Telerik_Web_UI_DialogHandler_aspx" path="Telerik.Web.UI.DialogHandler.aspx" type="Telerik.Web.UI.DialogHandler" verb="*" preCondition="integratedMode" /> <add name="Telerik_RadUploadProgressHandler_ashx" path="Telerik.RadUploadProgressHandler.ashx" type="Telerik.Web.UI.RadUploadProgressHandler" verb="*" preCondition="integratedMode" /> <add name="Telerik_Web_UI_WebResource_axd" path="Telerik.Web.UI.WebResource.axd" type="Telerik.Web.UI.WebResource" verb="*" preCondition="integratedMode" /> <remove name="ChartImage_axd" /><remove name="Telerik_Web_UI_SpellCheckHandler_axd" /><remove name="Telerik_Web_UI_DialogHandler_aspx" /><remove name="Telerik_RadUploadProgressHandler_ashx" /><remove name="Telerik_Web_UI_WebResource_axd" /><add name="ChartImage_axd" path="ChartImage.axd" type="Telerik.Web.UI.ChartHttpHandler" verb="*" preCondition="integratedMode" /></handlers>
Regression introduced in: 2025.4.1111
When RadEditor is in HTML mode, calling get_html() without parameters modifies self-closing tags in the returned content.
According to the documented API behavior, the RadEditor client filters should modify the returned content only when the isFiltered argument is set to true. However, the content is currently passed through browser DOM serialization even when filtering is not requested. This normalizes HTML void elements and removes the XHTML self-closing slash.
Steps to reproduce
<img alt="" src="image.png" />
Actual result
The returned markup is modified and the self-closing slash is removed:
<img alt="" src="image.png">
Expected result
When filtering is not requested, the content entered in HTML mode should be returned without filter-related DOM serialization:
<img alt="" src="image.png" />
Calling editor.get_html(true) may modify the returned content according to the enabled RadEditor client filters.
Impact
Applications that store, compare, validate, or further process XHTML-compatible markup may receive content different from the source entered by the user. This can affect integrations that rely on self-closing tag syntax.
Hi Progress Telerik Team,
Our security team has reported a Content Security Policy issue related to inline scripts in Progress Telerik UI for ASP.NET AJAX. Could you please add nonce support for inline scripts so we can resolve this issue in a compliant way?
Please let us know if you need any additional details from our side.
Thank you,
Hira Kewlani
After upgrading to 2026.2.708, RadAsyncUpload file uploads fail with HTTP 403 Forbidden originating from the new CSRF validation (AsyncUploadHandler.ValidateCsrfToken). The handler returns an HTML error response.
The failure occurs only in our multi-host (load-balanced) environment. In multihost environment as well Issue is inconsistent. The exact same build works correctly on a single-node local/dev machine.
Refer support ticket raise for the Issue to get more detail.
RadAsyncUpload fails with HTTP 403 (ValidateCsrfToken) in multi-node/web-farm environment after upgrade to 2026.2.708 | View Ticket | Your Account
I'm using a RadTab and one of the RadPageViews starts with an RadAsyncUpload-Control. When I use arrow keys to select this tab and try to use the Tab-Key to focus the next element (the RadAsyncUpload in this case) nothing happens. If any other control (like a textbox) is placed above my upload control there is no problem focusing it.
You can see this in the attached Demoproject when using arrow keys to select to RpvUpload.
There is significant latency when a user has many images in a list or dropdown list, particularly those with sub-choices that also have images. Because of this, we tried implementing design-time templates to allow lazy loading of images for RadComboBox. While implementing a solution is possible, it was much more complicated than expected.
We have previuisly raised a feature request for simular controls that was fixed (Thanks for that) but our topp prioority component is The combobox. see Allow lazy loading of images with design-time templates for ListBox and ComboBox
During the discussion a few questions was rasied from telerik:
Currently, the ComboBox has the Load on Demand functionality which focuses on loading items as needed, but it does not specifically address lazy loading of images inside the templates. Before proceeding further, I’d like to confirm your current setup to suggest the best approach:
Reasons (Hope it makes sense)
Only server-side databinding (with both controls).
We are using both ItemTemplate with custom images (where we then control lazy loading ourselves) and ImageUrl where we lose this possibility and have issues. We also dynamically load custom controls (ITemplate) in a few places.
Hello Telerik Team, I'm implementing HeaderContext filtering with checkbox lists on a RadGrid in a legacy ASP.NET WebForms application. Current Setup: - FilterType="HeaderContext" - FilterCheckListEnableLoadOnDemand="true" - OnFilterCheckListItemsRequested event populates checkboxes from session data Issue: Users experience 500-2000ms delay when opening filter menus (AJAX callback to server). In our production environment with slow network and high concurrent users, this creates poor user experience. Questions: 1. Is there a way to pre-populate checkbox lists during grid initialization (avoiding AJAX callback)? 2. Can we use OnItemCreated to populate checkbox lists with FilterCheckListEnableLoadOnDemand="false"? If so, what's the correct approach? 3. Is there a client-side caching mechanism for checkbox list items? 4. What's the recommended pattern for large datasets (1000+ rows) with multiple filterable columns? Environment: - Telerik.Web.UI version:v4.0.30319- .NET Framework: 4.8 - Browser: Chrome, IE11 - Grid has ~10 columns with 5 using checkbox filters Any guidance on performance optimization would be greatly appreciated! Thank you, Anurag pandey
Attached my grid code. Most columns are removed for readability
<telerik:RadGrid ID="grdChanges" runat="server" Width="1140"
skin="WebBlue" style="margin-top:13px; margin-right:13px; outline: 0 !important;"
ShowFooter="false" AllowSorting="false">
<ClientSettings>
<Scrolling AllowScroll="True" ScrollHeight="487px" UseStaticHeaders="true" />
</ClientSettings>
<MasterTableView GroupLoadMode="Client" AutoGenerateColumns="False" HeaderStyle-Font-Bold="true">
<HeaderStyle CssClass="InnerHeaderStyle"/>
<ItemStyle CssClass="InnerItemStyle"/>
<AlternatingItemStyle CssClass="InnerAlernatingItemStyle"/>
<CommandItemStyle CssClass="CommandHeaderStyle" />
<ColumnGroups>
<telerik:GridColumnGroup Name="Passenger Trips" HeaderText="Passenger Trips" HeaderStyle-HorizontalAlign="Center"/>
<telerik:GridColumnGroup Name="Ton Trips" HeaderText="Ton Trips" HeaderStyle-HorizontalAlign="Center"/>
<telerik:GridColumnGroup Name="Miles Per Trip" HeaderText="Miles Per Trip" HeaderStyle-HorizontalAlign="Center"/>
<telerik:GridColumnGroup Name="Miles Per Hour" HeaderText="Miles Per Hour" HeaderStyle-HorizontalAlign="Center"/>
</ColumnGroups>
<Columns>
<telerik:GridNumericColumn DataField="MilesPerHour_Proj" HeaderText="Project"
ColumnGroupName ="Miles Per Hour"
DataFormatString="{0:N1}" DecimalDigits="0"
HeaderStyle-HorizontalAlign="Center"
HeaderStyle-Width="60px" ItemStyle-BackColor="White"
ItemStyle-HorizontalAlign="Right" AllowRounding="true" />
<telerik:GridNumericColumn DataField="MilesPerHour_Base" HeaderText="Base"
ColumnGroupName ="Miles Per Hour"
DataFormatString="{0:N1}" DecimalDigits="0"
HeaderStyle-HorizontalAlign="Center"
HeaderStyle-Width="60px" ItemStyle-BackColor="White"
ItemStyle-HorizontalAlign="Right" AllowRounding="true" />
<telerik:GridNumericColumn DataField="MilesPerHourChange" HeaderText="Change"
ColumnGroupName ="Miles Per Hour"
DataFormatString="{0:N1}" DecimalDigits="0"
HeaderStyle-HorizontalAlign="Center"
HeaderStyle-Width="60px" ItemStyle-BackColor="White"
ItemStyle-HorizontalAlign="Right" AllowRounding="true" />
</Columns>
<NoRecordsTemplate>
<div style="padding: 5px">
No records available.
</div>
</NoRecordsTemplate>
</MasterTableView>
<FilterMenu EnableTheming="True">
<CollapseAnimation Duration="200" Type="OutQuint" />
</FilterMenu>
</telerik:RadGrid>
Hello,
ChatGPT recommended "Turn off Telerik’s “old” ARIA settings (they are overly strict and often invalid):"
i removed it and it worked. WTH?
What i supposed to do now? I added these settings in all our products
<telerik:RadGrid ID="grdImpacts" runat="server" EnableAriaSupport="true"
The problem is that when you click the buttons, the RadDateRangePicker is filled with the start of 2025-06-01 and the end of 2025-06-30. Then, when you click the button again, a change should occur in the RadDateRangePicker: start of 2025-07-01 and end of 2025-07-31.
1 step => correct
2 step => incorrect
Result
The first time you click the button, it returns the start date to 06/01/2025 and the end date to 06/30/2025 (this is correct). Clicking it again returns the start date to 06/30/2025 and the end date to 07/31/2025 (this is incorrect).
Work around
- Local page
js code fixed
const datepicker = $find('<%= radDateRangePicker2.ClientID %>');
datepicker.set_rangeSelectionStartDate(null);
datepicker.set_rangeSelectionEndDate(null);
- Global fixed All controls
C# in extension control
public bool EnableDateResetting
{
get => ViewState["EnableDateResetting"] as bool? ?? false;
set => ViewState["EnableDateResetting"] = value;
}
public eDateRangePicker() : base()
{
Load += EDateRangePicker_Load;
}
private void EDateRangePicker_Load(object sender, EventArgs e)
{
if (EnableDateResetting)
{
RegisterDateResettingScript();
}
}
private void RegisterDateResettingScript()
{
string script = $@"
Sys.Application.add_load(function() {{
const picker = $find('{ClientID}');
if (picker) {{
const origStart = picker.set_rangeSelectionStartDate;
const origEnd = picker.set_rangeSelectionEndDate;
picker.set_rangeSelectionStartDate = function(date) {{
if (date !== null && !this._isResetting) {{
const currentStart = this.get_rangeSelectionStartDate();
const currentEnd = this.get_rangeSelectionEndDate();
if (currentStart || currentEnd) {{
this._isResetting = true;
origStart.call(this, null);
origEnd.call(this, null);
this._isResetting = false;
}}
}}
return origStart.call(this, date);
}};
picker.set_rangeSelectionEndDate = function(date) {{
return origEnd.call(this, date);
}};
}}
}});
";
ScriptManager.RegisterStartupScript(this, GetType(), $"DateResetting_{ClientID}", script, true);
}When using client-side code to filter my Grid, the "BETWEEN" filter does not work well when filtering DateTime values where the time is after 12:00 AM.
i.e., filtering the dates between 9/11/2025 and 9/12/2025 does not include 9/12/2025 at 12:01 AM or any date where the time is after 12:00 AM.
Additionally, when passing datetime values to the filter function, the time component is dropped afterward.
var filter = "9/11/2025,12:00:00,AM 9/12/2025,11:59:59,PM"
tableView.filter(columnName, filter, "Between");
<FilterTemplate>
<telerik:RadLabel runat="server" AssociatedControlID="FromOrderDatePicker" Text="From"></telerik:RadLabel>
<telerik:RadDatePicker RenderMode="Lightweight" ID="FromOrderDatePicker" runat="server" Width="140px" ClientEvents-OnDateSelected="FromDateSelected"
MinDate="07-04-1996" MaxDate="05-06-1998" FocusedDate="07-04-1996" DbSelectedDate='<%# startDate %>' />
<telerik:RadLabel runat="server" AssociatedControlID="ToOrderDatePicker" Text="to" Style="padding-left: 5px;"></telerik:RadLabel>
<telerik:RadDatePicker RenderMode="Lightweight" ID="ToOrderDatePicker" runat="server" Width="140px" ClientEvents-OnDateSelected="ToDateSelected"
MinDate="07-04-1996" MaxDate="05-06-1998" FocusedDate="05-06-1998" DbSelectedDate='<%# endDate %>' />
<telerik:RadScriptBlock ID="RadScriptBlock1" runat="server">
<script type="text/javascript">
function FromDateSelected(sender, args) {
var tableView = $find("<%# ((GridItem)Container).OwnerTableView.ClientID %>");
var ToPicker = $find('<%# ((GridItem)Container).FindControl("ToOrderDatePicker").ClientID %>');
var fromDate = FormatSelectedDate(sender) + ",12:00:00,AM";
var toDate = FormatSelectedDate(ToPicker) + ",11:59:59,PM";
tableView.filter("OrderDate", fromDate + " " + toDate, "Between");
}
function ToDateSelected(sender, args) {
var tableView = $find("<%# ((GridItem)Container).OwnerTableView.ClientID %>");
var FromPicker = $find('<%# ((GridItem)Container).FindControl("FromOrderDatePicker").ClientID %>');
var fromDate = FormatSelectedDate(FromPicker);
var toDate = FormatSelectedDate(sender);
tableView.filter("OrderDate", fromDate + " " + toDate, "Between");
}
function FormatSelectedDate(picker) {
var date = picker.get_selectedDate();
var dateInput = picker.get_dateInput();
var formattedDate = dateInput.get_dateFormatInfo().FormatDate(date, dateInput.get_displayDateFormat());
return formattedDate;
}
</script>
</telerik:RadScriptBlock>
</FilterTemplate>
For more details, you can take Ticket 1702122 as a reference.
I recently upgraded the Telerik version from 2025.1.416 to 2025.3.825, and started getting this NullReferenceException during debugging.
I noticed I get the error when debugging RadGrid with the Skin property.
The Box Plot Chart throws the following errors when used:
RadHtmlChart.js:1 Uncaught ReferenceError: series is not defined Uncaught (in promise) ReferenceError: series is not defined