If we want to use Telerik ASP.NET AJAX controls in MVC project, we must also use either ScriptManager or RadScriptManager. But since neither works very well here is more MVC friendly solution:
public class RadMvcScriptManager : RadScriptManager
{
static string JavaScriptBlockFormat = @"<script type=""text/javascript"">
//<![CDATA[
{0}
//]]>
</script>";
protected override void Render(HtmlTextWriter writer)
{
foreach (RegisteredScript script in GetRegisteredClientScriptBlocks())
{
if (HttpContext.Current.Items[script.Key] == null)
{
HttpContext.Current.Items[script.Key] = true;
if (script.ScriptType == RegisteredScriptType.ClientScriptInclude)
{
writer.WriteLine(String.Format(@"<script type=""text/javascript"" src=""{0}""></script>",
HttpUtility.HtmlEncode(script.Url)));
}
}
}
if (HttpContext.Current.Items["AppInitialize"] == null)
{
Page.Items["AppInitialize"] = true;
writer.WriteLine(
String.Format(
JavaScriptBlockFormat,
@"if(typeof(Sys) != ""undefined""){
$addHandler(window, ""load"", function(){Sys.Application.initialize();}); }
else { throw new Error(""Microsoft ASP.NET AJAX cannot be initialized!"")}"));
}
StringBuilder builder = new StringBuilder();
if (HasReflectionPermission())
{
SerializeScriptsForScriptControls(Page, builder);
}
string scriptContent = builder.ToString();
if (!String.IsNullOrEmpty(scriptContent))
{
writer.WriteLine(String.Format(
JavaScriptBlockFormat,
String.Format("Sys.Application.add_init(function(){{{0}}});", scriptContent)));
}
}
internal void SerializeScriptsForScriptControls(Control control, StringBuilder builder)
{
if (control is IScriptControl && control.Visible)
{
IEnumerable<ScriptDescriptor> descriptors = ((IScriptControl)control).GetScriptDescriptors();
if (descriptors != null)
{
foreach (ScriptDescriptor descriptor in descriptors)
{
SerializeScriptControlDescriptor(descriptor, builder);
}
}
}
if (control.HasControls())
{
foreach (Control child in control.Controls)
{
SerializeScriptsForScriptControls(child, builder);
}
}
}
internal void SerializeScriptControlDescriptor(ScriptDescriptor descriptor, StringBuilder builder)
{
MethodInfo getScriptInfo = descriptor.GetType().GetMethod(
"GetScript",
BindingFlags.Instance | BindingFlags.NonPublic);
if (getScriptInfo != null)
{
string script = (string)getScriptInfo.Invoke(descriptor, new object[] { });
builder.AppendLine(script);
}
}
internal static bool HasReflectionPermission()
{
try
{
new ReflectionPermission(ReflectionPermissionFlag.MemberAccess).Demand();
return true;
}
catch (SecurityException)
{
return false;
}
}
}
dfce08e8-ebe0-43ea-b3fb-ec25412c534a|23|5.0