2010-11-23 11 views
6

Tengo varios elementos <asp:TextBox TextMode="MultiLine"> en una página. En la carga, los rellene (a través del código VB detrás), y luego los convierto en editores TinyMCE (a través del plugin jQuery TinyMCE). Cada cuadro de texto también tiene un botón asociado, con el propósito de enviar el texto de vuelta al código subyacente para su inserción en una base de datos.TinyMCE Textarea Cambio no reconocido por ASP.NET CodeBehind

Descubrí anteriormente que cuando se hace clic en el botón Enviar, tengo que "guardar" el contenido del editor en el cuadro de texto, pero ese no es mi problema. Incluso después de hacerlo, las ediciones no aparecen en el código subyacente.

Como he mencionado, estoy usando jQuery. Aquí está mi controlador de clics. Tenga en cuenta que todos los botones son botones de envío en ASP.NET, por lo tanto, la clase submit:

$('input.submit').live('click', function() { 
    tinyMCE.EditorManager.triggerSave(); 
}); 

lo tanto, cuando cualquier botón de envío se hace clic todos los editores tinymce tienen su evento guardar activa. Después de que esto se ejecuta, he comprobado el valor del área de texto que estoy buscando, (de nuevo, a través de JavaScript) y parece tener las ediciones (estoy usando las herramientas de desarrollador de Chrome y console.log):

console.log($(this).parent().find('textarea').val()); 

en el lado del servidor, sin embargo, no veo ninguna de las modificaciones en el controlador de clic para el botón de enviar:

Dim paragraph As String = Me.myTextArea.Text 
' Results in the original text, not the edited text 

Otras Notas:

  • Cada editor está en su propio panel de actualización
  • Debido a la naturaleza del contenido enviado (HTML), tuve que configurar EnableEventValidation="false" y ValidateRequest="false" (esta es una aplicación interna, y esta recomendación vino de un desarrollador más experimentado)
  • Soy bastante nuevo en .NET, pero este comportamiento me parece ridículo. Debo estar perdiendo algo crítico.
+0

¿Cómo transfieres los datos al servidor? – Thariama

+0

El botón usa 'OnCommand', con un apropiado' CommandName' y 'CommandArgument', y luego en el código subyacente, accedo a los datos por' Me.myTextArea.Text'. –

+0

Creo que ya descubrí el problema, pero aún no he probado mi teoría. Creo que la devolución de datos 'OnCommand' se está ejecutando primero (enviando asíncronamente los datos antiguos), luego mi punto de interrupción en el JS es golpeado (entonces veo el texto editado en el depurador), y luego mi punto de interrupción en el VB es golpeado (por lo Veo el texto anterior en el depurador de VB). Parece una teoría sólida, pero como dije, no probó. –

Respuesta

6

Lo he descubierto.

Fue exactamente lo que sugerí en mi comentario sobre la pregunta original. La postback asincrónica de ASP.NET se estaba disparando, enviando el texto anterior al servidor. Luego, mi onclick se disparaba, guardando el texto nuevo en el área de texto y tocando mi punto de interrupción (lo que me permite ver que el nuevo texto, de hecho, se guardó en el área de texto). Después de eso, el servidor procesó el texto (antiguo), golpeando mi punto de interrupción en el VB.

Parece que ASP.NET obtiene la máxima prioridad en cualquier clic que ocurra, al menos cuando usa medios asincrónicos. Esto significa que cualquier manejador de clic personalizado agregado mediante javascript activará después de el clic de ASP.NET.

Esto tiene algo de sentido, dado que JS procesa múltiples manejadores de clics: se trata de un proceso de orden de llegada.

La solución, en mi caso, era para guardar el contenido del editor TinyMCE en el cambio, en lugar de en el botón de clic:

$(this).tinymce({ 
    script_url : '../scripts/tiny_mce.js', 
    theme: 'advanced', 
    plugins: 'save', 
    theme_advanced_buttons1 : 'bold,italic,underline,|,justifyleft,justifycenter,justifyright,justifyfull,|,image,link,unlink,|,fontsizeselect,forecolorpicker', 
    theme_advanced_buttons2 : '', 
    theme_advanced_buttons3 : '', 
    content_css : '../css/landingpage-tinymce.css', 
    onchange_callback: function(ed) { 
     ed.save(); 
    } 
}); 

Nota del onchange_callback lo que ahorra el contenido del editor para el área de texto .Esto guardará los contenidos cada vez que el editor agregue lo que ellos llaman un "nivel de deshacer", lo que significa que cada vez que los usuarios cambien algo y muevan el cursor, o cada vez que el editor se desenfoque, entre otros eventos.

+0

Resulta que esta no es toda la historia, no está funcionando en todos los casos. No sé cuál es el problema, pero cualquier ayuda sería muy apreciada. –

+0

Resulta que soy tonto: mi nuevo error fue causado por la falta de 'If Not Page.IsPostBack ... End If' –