En la versión 4.5 de Dotnetnuke es increíblemente fácil actualizar un módulo de Dotnetnuke para que funcione con AJAX. En esta entrada se describe las dos maneras de aplicar AJAX en módulos Dotnetnuke.
Usando Control Definitions
Suponiendo que el servidor web en el que corre Dotnetnuke tiene AJAX instalado, al habilitar un control específico de un módulo para usarlo, el módulo completo es envuelto en un UpdatePanel. Esto se logra de dos maneras:
1) Al instalar el módulo agregar en el nodo Control este valor:
<code><supportspartialrendering>true</supportspartialrendering></code>
2) Con el módulo instalado ingresar a Host>Module Definitions>, seleccionar el módulo deseado y seleccionar el control para el que se habilitará AJAX y marcar el campo Supports Partial Rendering.

Cuando Partial Rendering está habilitado, se puede aprovechar la librería de AJAX de Microsoft y el Control Toolkit de Microsoft.
Para probar con un ejemplo simple, en una página con un par de controles de etiqueta (Label) y un Botón. La segunda etiqueta y el botón dentro de un UpdatePanel, la primera etiqueta fuera.

Luego, agregar un evento click vacío Click al Button, un timer y una actualización a los datos de las etiquetas.
<code>
System.Threading.Thread.Sleep(3000)
Label1.Text = DateTime.Now()
Label2.Text = DateTime.Now()
</code>
Al hacer click, la hora solo se actualizará la etiqueta que está dentro del panel y la otra permancerá sin cambios.

El desarrollador al control
Hay que recordar que solo puede existir un objeto ScriptManager en cada página, como Dotnetnuke es en realidad una página, lógicamente la responsabilidad de agregarlo dinámicamente debe recaer en el framework y no en los módulos. De eso precisamente se encarga la clase Dotnetnuke.Framework.Ajax. La clase presenta ocho métodos:

- AddScriptManager: usada internamente por el framework para agregar un control ScriptManager a la página.
- ContentTemplateContainerControl: Devuelve una referencia al control ContentTemplateContainer dentro de un UpdatePanel
- CreateUpdatePanelControl: crea una instancia de un control UpdatePanel de manera dinámica en la página
- IsInstalled: Retorna un valor de tipo boolean para determina si AJAX se ha instalado en el servidor.
- RegisterScriptManager: se usa para instruir al framework que AJAX es requerido para la página.
- RemoveScriptManager: Remueve el control ScriptManager durante el evento de Page Render si el método RegisterScriptManager no fue llamado.
- ScriptManagerControl: devuelve una referencia al control ScriptManager de la página.
- SetScriptManagerProperty: asigna valores a las propiedades del control ScriptManager usando reflection.
Usando IsInstalled() es posible determinar si AJAX se encuentra instalado en el servidor, al combinarlo con RegisterScriptManager se podrá instruir a Dotnetnuke que agregué el control ScriptManager para que el control del módulo puede acceder a Ajax. De esta manera el resultado del ejemplo anterior es exactamente el mismo sin necesidad de habilitar partial rendering en el control.
<code>If DotNetNuke.Framework.AJAX.IsInstalled() Then
DotNetNuke.Framework.AJAX.RegisterScriptManager()
'Do some stuff
End If
</code>