Non è la prima volta che in un progetto web uso FCKeditor per l'editing rich-text.
E' pero' la prima volta che mi capita di usarlo insieme a Microsoft Ajax e più precisamente all'interno di un UpdatePanel.
Il problema che affligge il controllo se usato all'interno di un UpdatePanel è che non mantiene il valore del testo modificato dopo un postback.
Per aggirare questa "issues" ho girovagato un po su internet fino a trovare questa elegante soluzione.
Problema n.1:
Purtroppo pero' questo non è sufficiente se il controllo FCKeditor è usato all'interno dei templates di edit e insert di una FormView.
In questo caso è necessario sottoscrivere l'evento ItemCreated della FormView e all'interno di questo "cercare" il controllo e registrare l'evento client script come indicato nel link precedente.
Problema n.2:
Purtroppo questo non è ancora sufficiente.La soluzione precedente non funziona.
Qui "UpdatePanel ci cova", infatti con l'uso dell'UpdatePanel è consigliabile utilizzare la classe ScriptManager invece della Page.ClientScript.
Ecco quindi questo post di Rick Strahl che spiega bene nel dettaglio come realizzare una ClientScriptProxy che via reflection sia in grado di utilizzare ScriptManager o Page.ClientScript in base al fatto che si stia usando Ajax o meno.
Soluzione finale:
1 - Utilizzare la classe ClientScriptProxy aggiungendo il metodo RegisterOnSubmitStatement:
public
void RegisterOnSubmitStatement(Control control, Type type, string key, string script)
{
if (IsMsAjax())
{
if (RegisterOnSubmitStatementMethod == null)
RegisterOnSubmitStatementMethod = scriptManagerType.GetMethod
("RegisterOnSubmitStatement", new Type[4] { typeof(Control), typeof(Type), typeof(string),
typeof(string) }); RegisterOnSubmitStatementMethod.Invoke(
null, new object[4] { control, type, key, script });
}
else
{
control.Page.ClientScript.RegisterOnSubmitStatement(type, key, script);
}
} 2 - Modificare il codice per l' FCKeditor nel modo seguente:
FCKeditor
editor = this.NewsFormView.FindControl("MyFCKeditorID") as FCKeditor;
if (editor != null)
{
ClientScriptProxy.Current.RegisterOnSubmitStatement(this, editor.GetType(),
"editor",
"FCKUpdateLinkedField('" + editor.ClientID + "')");
}