Component: RadFilter ( RadFilterExpressionConverter , RadFilterExpressionSerializer )
Affected: 2026.2.708 and later, where the JSON serializer replaced the Newtonsoft one
Description:
RadFilterExpressionConverter.IsValidFieldName ( RadFilterExpressionConverter.cs:180 ) allows only letters, digits, _ and . . Any other FieldName is silently replaced with null during LoadSettings() . SaveSettings() does not validate, so a bracket-qualified name saves but can't be loaded.
Steps to reproduce
1. Create a RadFilter with a RadFilterTextFieldEditor where FieldName = "[dataBooking].[TotalPaid]" .
2. Add a RadFilterLessThanFilterExpression<string> on that field with the value "1000" .
3. Call SaveSettings() . The JSON contains "FieldName":"[dataBooking].[TotalPaid]" .
4. On a new RadFilter with the same editor, call LoadSettings(saved) .
Sample console application code snippet to reproduce the issue:
using System;
using System.Collections;
using Telerik.Web.UI;
namespace RadFilterBracketFieldNameRepro
{
class Program
{
private const string BracketedFieldName = "[dataBooking].[TotalPaid]";
static void Main()
{
Console.WriteLine("Telerik.Web.UI version: " + typeof(RadFilter).Assembly.GetName().Version);
Console.WriteLine("FieldName under test: " + BracketedFieldName);
Console.WriteLine();
// 1) Build a filter with one expression against a bracket-qualified field name.
// This format is not unusual -- it's what you get for any field name that needs
// to be schema/table-qualified. Telerik's own RadFilterSqlExpressionEvaluator
// produces the same "[table].[column]" shape when generating SQL.
RadFilter source = new RadFilter();
source.FieldEditors.Add(new RadFilterTextFieldEditor { FieldName = BracketedFieldName });
RadFilterLessThanFilterExpression<string> expression = new RadFilterLessThanFilterExpression<string>(BracketedFieldName);
((IRadFilterValueExpression)expression).SetValues(new ArrayList { "1000" });
source.RootGroup.AddExpression(expression);
// 2) Persist it the normal way.
string savedState = source.SaveSettings();
Console.WriteLine("SaveSettings() output (base64):");
Console.WriteLine(savedState);
Console.WriteLine();
Console.WriteLine("Decoded JSON:");
Console.WriteLine(System.Text.Encoding.UTF8.GetString(Convert.FromBase64String(savedState)));
Console.WriteLine();
// 3) Simulate the next request restoring that saved state into a fresh RadFilter,
// exactly like a report/page reload would.
RadFilter restored = new RadFilter();
restored.FieldEditors.Add(new RadFilterTextFieldEditor { FieldName = BracketedFieldName });
try
{
restored.LoadSettings(savedState);
RadFilterLessThanFilterExpression<string> restoredExpression = (RadFilterLessThanFilterExpression<string>)restored.RootGroup.Expressions[0];
Console.WriteLine("FieldName after LoadSettings(): '" + restoredExpression.FieldName + "'");
Console.WriteLine(restoredExpression.FieldName == BracketedFieldName
? "OK -- FieldName round-tripped correctly."
: "BUG REPRODUCED -- FieldName was lost during LoadSettings().");
}
catch (Exception ex)
{
Console.WriteLine("BUG REPRODUCED -- LoadSettings() threw:");
Console.WriteLine(ex);
}
Console.WriteLine();
Console.WriteLine("Press Enter to exit...");
Console.ReadLine();
}
}
}
Expected: The expression is restored with its original FieldName.
Actual:
System.ArgumentException: Parameter cannot be null or empty. Parameter name: fieldName RadFilterDataFieldEditorCollection.FindEditorForFieldName RadFilterSingleExpressionItem.SetupFunctionInterface RadFilter.CreateFilterItems / CreateChildControls RadFilter.RecreateControl RadFilter.LoadSettings
The current page FileList items are not properly updated when the paging is enabled. Returning to a previously paged folder is properly restored to page 1, but it keeps showing the content of lastly listed page. The issue is reproducible in all explorer modes of the control. Video - http://screencast.com/t/KVpgADxanuh
1. Click the ComboBox
2. Select an item in its dropdown
3. Expected: no exception on selection, actual: A "Selection out of range" exception is thrown.
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Telerik.Web.UI;
public partial class ComboBoxNavigation : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
}
}
private DataTable CreateTestTable()
{
DataTable table = new DataTable();
table.Columns.Add("Text");
table.Columns.Add("Value");
table.Columns.Add("test");
table.Rows.Add("Item1", "1", "aaa");
table.Rows.Add("Item1", "1", "aaa");
table.Rows.Add("Item1", "1", "aaa");
return table;
}
protected void rcbStaff_ItemsRequested(object sender, RadComboBoxItemsRequestedEventArgs e)
{
RadComboBox rcbUser = sender as RadComboBox;
rcbUser.DataSource = CreateTestTable();
rcbUser.DataTextField = "Text";
rcbUser.DataValueField = "Value";
rcbUser.DataBind();
}
protected void rcbStaff_SelectedIndexChanged(object sender, RadComboBoxSelectedIndexChangedEventArgs e)
{
}
} <telerik:RadNavigation ID="RadNavigation1" runat="server">
<Nodes>
<telerik:NavigationNode Text="Home" />
<telerik:NavigationNode Text="Candidate" />
<telerik:NavigationNode Text="Preliminary Candidate" />
<telerik:NavigationNode Text="StaffSearch" CssClass="staffSearchWrapper rootTemplate">
<NodeTemplate>
<telerik:RadComboBox ID="rcbStaff"
AutoPostBack="true"
runat="server"
EnableLoadOnDemand="True"
OnItemsRequested="rcbStaff_ItemsRequested"
OnSelectedIndexChanged="rcbStaff_SelectedIndexChanged"
>
</telerik:RadComboBox>
</NodeTemplate>
</telerik:NavigationNode>
</Nodes>
</telerik:RadNavigation>There are missing methods in the TypeScript definitions provided. You can find attached a file that illustrates what needs to be updated.
A workaround is to remove the loading sign functionality by placing the following script at the end of the form tag The second override is necessary only if you use the OnClientDataLoaded event to alter the data and add fields in the data object that do not exist in the server response. You need to rename the OnClientDataLoaded method call to use your actual method name. You can find an example of both workarounds and their usage attached. Some additional information: - If possible, move the tiles out of the AJAX request, as this will eliminate all of the problems. Depending on the actual scenario perhaps you can make sure they are not in an update panel (e.g., position them absolutely on the page while keeping their markup out of the partial postback). - consider moving any data formatting logic from the event handler to the template. You can define functions that format the code in the template, not only in the event. An example is available in the attached file. Alternatively, you can return the data formatted from the web service. - consider reducing the time interval for the requests, because after the AJAX request, only 1 of 2 requests will update the tile UI.
In lightweight the issue is not observed:
<telerik:RadRibbonBar runat="server" RenderMode="Classic">
<Tabs>
<telerik:RibbonBarTab Text="home">
<%-- duplicate the group and items inside to replicate more easily --%>
<telerik:RibbonBarGroup Text="Documents">
<Items>
<telerik:RibbonBarButton Text="Item 1" />
</Items>
</telerik:RibbonBarGroup>
</telerik:RibbonBarTab>
</Tabs>
</telerik:RadRibbonBar>
The Delete and Backspace buttons remain enabled in spell check mode, allowing the client to delete selections inside the Editor's content area. Steps to reproduce: 1. Open http://demos.telerik.com/aspnet-ajax/editor/examples/spellchecker/defaultcs.aspx 2. Click the Spell check icon 3. Select several words from the content and press Backspace/Delete Result: The selected content is deleted Expected: The Delete/Backspace button press is ignored
OnClientModeChange event is not fired in Mobile RenderMode.
Steps to reproduce:
Run the following code in a mobile Chrome (or mobile emulation) and click the edit Pencil button that switches the edit modes:
<script type="text/javascript">
function OnClientModeChange(editor, args) {
var mode = editor.get_mode();
switch (mode) {
case 1:
alert("We are in Design mode");
//do something
break;
case 2:
alert("We are in Html mode");
//do something
break;
case 4:
alert("We are in Preview mode");
//do something
break;
}
}
</script>
<telerik:RadEditor runat="server" OnClientModeChange="OnClientModeChange" ID="RadEditor1" RenderMode="Auto">
</telerik:RadEditor>
Images with "*.jpeg" extension are saved as "*.jpg" in a different file even if the "Overwrite" option is checked.
Steps to reproduce:
1. Open an image with "*.jpeg" extension in ImageEditor (e.g. test.JPEG)
When tabbing from first PanelBar to the second one it neither passes through the contentTemplate elements, nor to the second panelbar:
<telerik:RadPanelBar runat="server" ID="radPnlBarFundingSources" Width="100%" ExpandMode="MultipleExpandedItems" TabIndex="1">
<Items>
<telerik:RadPanelItem runat="server" Text="Funding Source">
<ContentTemplate>
<telerik:RadListBox runat="server" ID="radLbAvailFundingSource" Height="100px" Width="40%" SelectionMode="Multiple" AllowTransfer="true" TransferMode="Move" AllowTransferOnDoubleClick="true" TransferToID="radLbSelFundingSource" ButtonSettings-AreaWidth="35px" Enabled="True" style="font-family: Verdana, Trebuchet MS,Arial,sans-serif; font-size:0.9em;"></telerik:RadListBox>
<telerik:RadListBox runat="server" ID="radLbSelFundingSource" Height="100px" Width="40%"></telerik:RadListBox>
</ContentTemplate>
</telerik:RadPanelItem>
</Items>
</telerik:RadPanelBar>
</div>
<div class="Row">
<telerik:RadPanelBar runat="server" ID="radPnlBarContracts" Width="100%" TabIndex="2">
<Items>
<telerik:RadPanelItem runat="server" Text="Contract">
<ContentTemplate>
<telerik:RadListBox runat="server" ID="radLbAvailContract" Height="100px" Width="40%" SelectionMode="Multiple" AllowTransfer="true" AllowTransferOnDoubleClick="true" TransferToID="radLbSelContract" AutButtonSettings-AreaWidth="35px"></telerik:RadListBox>
<telerik:RadListBox runat="server" ID="radLbSelContract" Height="100px" Width="40%"></telerik:RadListBox>
</ContentTemplate>
</telerik:RadPanelItem>
</Items>
</telerik:RadPanelBar>
A property to handle that would be very convenient. This way developers could be able to restrict the number of rows that the user can type. Something like MaxRowNumber. Additionally, a property MaxColumnNumber would be also useful to restrict the length of each row.
The Bold, Italic, Underline, Justify, Indent, Outdent and other commands are not localized in the Undo/Redo dropdowns. Screenshots:Can be seen at http://demos.telerik.com/aspnet-ajax/editor/examples/localization/defaultcs.aspx.