Troubleshooting
This article contains common problems related to using callbacks from RadXmlHttpPanel:
- Compatibility issues with RadScriptManager and RadStyleSheetManager
- Event Handlers Might Not Be Not Raised in a Default Document in IIS 7 or IIS 7.5 Integrated Mode
- Excessive Requests
- Type xxxxxxxx Has Already Been Registered
- Client-side Objects Not Available
Compatibility issues with RadScriptManager and RadStyleSheetManager
The RadXmlHttpPanel has known compatibility issues with RadScriptManager and RadStyleSheetManager. Both managers combine all the requests (RadScriptManager combines the requests to the JavaScript assembly resource files and RadStyleSheetManager combines the ones to stylesheet resource files of all Telerik controls present on the page),into a single request.
Because the page does not go through its normal life cycle, after the Telerik controls have been updated by the RadXmlHttpPanel, the controls’ scripts and stylesheets need to be evaluated and applied, respectively. This, however cannot be done if the scripts (and the stylesheets) are combined into a single file - the RadXmlHttpPanel cannot find the right scripts and styles for the respective Telerik control. That is why there might be client-script errors and the styles will not be applied correctly if the RadXmlHttpPanel is used together with the RadStyleSheetManager and the RadScriptManager.
There are 2 ways to solve this problem:
use the Microsoft AJAX ScriptManager control
OR, set EnableScriptCombine="false" for RadScriptManager and EnableStyleSheetCombine="false" to RadStyleSheetManager.
Event Handlers Might Not Be Not Raised in a Default Document in IIS 7 or IIS 7.5 Integrated Mode
Problem
When RadCompression is enabled and you are using .NET 4.0, event handlers might not be raised in a default document in IIS 7 or IIS 7.5 Integrated Mode, which could break the normal work of RadXmlHttpPanel.
Solution
This problem is caused by a breaking change in .NET 4.0 described here. To workaround it one can set preCondition="managedHandler" for the RadCompression module. You may also need to remove the runAllManagedModulesForAllRequests setting from your web.config if you have it (or set it to false).
Excessive Requests
When the EnableClientScriptEvaluation
property of the RadXmlHttpPanel control is set to true
it will:
- Create
<script>
new tags in the<head>
with thesrc
attributes of the<script>
tags that exist in the response. This will cause the browser to request them. WhenIScriptControl
instances like the Telerik® UI for ASP.NET AJAX controls are present, they will bring all their scripts with the response each time, which means that each callback will request them again. - Copy
<script>
tags with inline content to the page where they will be evaluated. This may cause code to run multiple times and cause a Type xxxxxxxx has already been registered error or some logic to run unexpectedly several times.
This behavior is expected and the performance hit or re-evaluation of scripts is not acceptable, you can:
- Remove the
IScriptControl
objects from the callback so it can be used to fetch data only. You can then use their client-side API to set the data in them. - Use partial postbacks through an
<asp:UpdatePanel>
or<telerik:RadAjaxPanel>
so the page goes through its complete lifecycle and controls are recreated as usual and new script entries are not created. See also Differences Between RadXmlHttpPanel and RadAjaxPanel. - Set the
EnableClientScriptEvaluation
property of the RadXmlHttpPanel control tofalse
. It can cause the control client-side objects to not be available.
Type xxxxxxxx Has Already Been Registered
This error can be raised if an IScriptControl
instance like a control from the Telerik® UI for ASP.NET AJAX suite is included in the callback and the EnableClientScriptEvaluation
property of the RadXmlHttpPanel control is set to true
. It will cause the scripts for the IScriptControl
instance to be re-evaluated and if they run twice, they may register types, events and namespaces numerous times.
This problem is to be expected in such a scenario and you can avoid it in a few ways:
- Set the
EnableClientScriptEvaluation
property of the RadXmlHttpPanel control tofalse
. This will cause the control client-side objects to not be available. - Set the
ScriptMode
property of theScriptManager
toRelease
, because the double registration error is thrown only in debug mode: https://msdn.microsoft.com/en-us/library/bb397723.aspx#Anchor_1. This property is also controlled by thedebug
attribute of thecompilation
element in theweb.config
. - remove the
IScriptControl
objects from the callback so it can be used to fetch data only. You can then use their client-side API to set the data in them. - use partial postbacks through an
<asp:UpdatePanel>
or<telerik:RadAjaxPanel>
so the page goes through its complete lifecycle and controls are recreated as usual and new script entries are not created. See also Differences Between RadXmlHttpPanel and RadAjaxPanel.
Client-side Objects Not Available
When you place an IScriptControl
object (like the ones from the Telerik® UI for ASP.NET AJAX suite) inside a RadXmlHttpPanel and you invoke a callback, the client-side object is not available anymore (e.g., $find()
returns null
).
This happens because callbacks are not designed to return complex controls, scripts, HTML and to execute the full code. Here is an example process sequence:
- Initially the controls are initialized by the MS AJAX framework, all their functionality, API and client-side object are available.
- A callback disposes the HTML elements and places the new HTML from the server instead of them. No scripts from the server are executed, so the
$create()
statement is not called by the MS AJAX framework, and the control's client-side object, API and events do not exist (e.g.,$find()
will returnnull
for it). For example, clicking a RadButton will not invoke the client-side functionality and events, but a full postback from the underlying<input>
HTML element. - After this full postback, the page goes through its normal lifecycle, the
$create()
statement is called, the RadButton client-side object exists and so the OnClientClicked handler will work until it is disposed by a callback again.
In such cases you can take three approaches:
- Redesign the page so it does not require user interaction with those controls, but only shows data/information in them.
- Use partial postbacks (e.g., through an
<asp:UpdatePanel>
or<telerik:RadAjaxPanel>
) so the page goes through its complete lifecycle and controls are recreated. See also Differences Between RadXmlHttpPanel and RadAjaxPanel. - Set the
EnableClientScriptEvaluation
property of the RadXmlHttpPanel control totrue
. It will evaluate the scripts that come with the response, including the$create()
statement which will initialize the client-side objects of the controls.Review the Excessive Requests section and the Type xxxxxxxx has already been registered section for information on issues this script evaluation can cause.