none
Porque no se ejecuta el evento ValueChanged al modificarlo desde JAVASCRIPT RRS feed

  • Pregunta

  • Hola comunidad, aqui de nuevo volviendome loco. En esta ocasion llevo meses buscando una respuesta por la web y probando miles de cosas diferentes, esta claro que no todo el dia, pero ya me he dado por vencido. Os comento el tema.

    Tengo un control HiddenField en un user control declarado asi

    <asp:HiddenField ID="hfContenido" runat="server" OnValueChanged="hfContenido_ValueChanged"  />

    Luego desde JAVASCRIPT modifico su valor tal que asi

    <script type="text/javascript">
      var area;
    
      function addArea() {
          area = new Editor({
              onSave: function (content, id, instance) {              
                  document.getElementById("<%=hfContenido.ClientID%>").value = content;              
              }          
          }).panelInstance('<%= Texto.ClientID %>');
      }
    </script>

    El tema es que no se me dispara el evento del HiddenField

    protected void hfContenido_ValueChanged(object sender, EventArgs e) { Text = hfContenido.Value; Texto.Text = Text; Guardar(sender); //invocar al evento }

        #region evento
        public event EventHandler Guardado;

        protected virtual void Guardar(object sender)
        {
            if (this.Guardado != null)
                this.Guardado(sender, new EventArgs());
        }
        #endregion

    Este evento lo que hace es lanzar el evento del usercontrol para que sea recogido en la pagina que lo esta utilizando.

    Como siempre toda ayuda sera super agradecida. Un saludo a tod@s


    DrUalcman



    viernes, 11 de marzo de 2016 2:21

Respuestas

  • Muchisimas gracias a todos.

    Ya lo consegui. El tema de lo de

    <httpRuntime requestValidationMode="2.0" />

    ya lo sabia, y realmente fue un fallo mio, ya que pensaba que ya estaba aplicado. Y por eso me estaba volviendo loco.

    Como siempre pongo el codigo ya resumido y organizado para que otros lo puedan disfrutar.

    Codigo en el User Control

    <%@ Control Language="C#" AutoEventWireup="true" CodeFile="wysiwyg.ascx.cs" Inherits="UserControls_wysiwyg" ValidateRequestMode="Inherit" %>
    <script type="text/javascript" src="http://js.nicedit.com/nicEdit-latest.js"></script>
    <script type="text/javascript">
    //<![CDATA[
      var area;
     
      function addArea() {
          area = new nicEditor({
              buttonList: ['bold', 'italic', 'underline', 'strikeThrough', 'subscript', 'superscript',
                           'left', 'center', 'right', 'justify', 'fontFamily', 'fontFormat', 'fontSize',
                           'ol', 'ul', 'indent', 'outdent', 'hr', 'forecolor', 'bgcolor', 'removeformat',
                           'upload', 'save'],
              onSave: function (content, id, instance) {              
                  document.getElementById("<%=hfContenido.ClientID%>").value = content;      
                  __doPostBack('<%=hfContenido.ClientID%>', content);
              }
          }).panelInstance('<%= Texto.ClientID %>');
      }
     
        bkLib.onDomLoaded(function () { addArea(); });    
        //]]>
    
      </script>
    
      <!-- Salvar el contenido de los que se esta escribirneo -->
      <asp:HiddenField ID="hfContenido" runat="server" OnValueChanged="hfContenido_ValueChanged" />

    Codigo en el Code Behind

        #region evento
        public event EventHandler Guardado;
    
        protected virtual void Guardar(object sender)
        {
            if (this.Guardado != null)
                this.Guardado(sender, new EventArgs());
        }
        #endregion
    
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                hfContenido.Value = "";
            }
            else
            {
                try
                {
                    if (Page.Request.Params["__EVENTTARGET"] == hfContenido.ClientID)
                    {
                        string dat = Page.Request.Params["__EVENTARGUMENT"].ToString();
                        if (!string.IsNullOrEmpty(dat))
                        {
                            hfContenido.Value = dat;
                        }
                        else
                        {
                            hfContenido.Value = "";
                        }
                    }
    
                }
                catch (Exception ex)
                {
                    smsError.Text = "Genero error.<br /><p>" + ex.Message + "</p><br /><p>" + ex.StackTrace + "</p>";
                    hfContenido.Value = "";
                }
            }
    
        }
    
        protected void hfContenido_ValueChanged(object sender, EventArgs e)
        {
            if (!string.IsNullOrEmpty(hfContenido.Value))
            {
                //Text = hfContenido.Value;
                Guardar(sender);            //invocar al evento
            }
        }


    Si a alquien se le ocurre alguna forma de evitar tener que poner el requestValidationMode="2.0" todas las ideas seran bien recibidas.

    Puedes descargar el UserControl que he creado aqui. Mas informacion aqui en mi blog.


    DrUalcman

    martes, 15 de marzo de 2016 0:54

Todas las respuestas

  • hola

    >>El tema es que no se me dispara el evento del HiddenField

    si revisas la documentacion

    HiddenField.ValueChanged (Evento)

    observaras que el evento se produce cuando el valor cambia entre eventos, cuando asignas desde javascript un valor no estas generando ningun post al servidor

    o sea lo que planteas no aplica

    quizas podrias evaluar si podrias lanzar el evento mediente __doPostBack o sea lo invocas desde codigo cliente de forma concreta

    Función __doPostBack

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 11 de marzo de 2016 4:41
  • Gracias Leandro una vez mas.

    He conseguido que me haga el post back, mi problema es que ahora no me visualiza bien los datos, recibo este error

    A potentially dangerous Request.Form value was detected from the client (ctl00$ContentPlaceHolder1$txtTextoBlog$hfContenido="...gr erg erg erg "). at System.Web.HttpRequest.ValidateString(String value, String collectionKey, RequestValidationSource requestCollection) at System.Web.HttpRequest.<>c__DisplayClass280_0.b__0(String key, String value) at System.Web.HttpValueCollection.EnsureKeyValidated(String key) at System.Web.HttpValueCollection.GetValues(Int32 index) at System.Collections.Specialized.NameValueCollection.Add(NameValueCollection c) at System.Web.HttpRequest.FillInParamsCollection() at System.Web.HttpRequest.GetParams() at System.Web.HttpRequest.get_Params() at UserControls_wysiwyg.hfContenido_ValueChanged(Object sender, EventArgs e) in d:\dzhosts\localuser\drualcman\www.gym4u.somee.com\UserControls\wysiwyg.ascx.cs:line 292

    La pagina tiene desabilitado el ValidateRequest y en el UserControl donde estoy poniendo esto para que me dispare el evento tambien lo tengo desabilitado.

    Para que lo entendais bien, estoy creando un usercontrol con obciones especiales para mi web que edita en HTML utilizando el javascript nicEditor.

    Si no hago el postback desde javascript, todo me lo hace bien, pero claro no me dispara el evento que es el encargado de visualizar el boton de "publicar" una vez "guardado" el texto con formato HTML.

    Lo estoy haciendo con un user control porque lo utilizo muchas veces dentro de mi web.


    DrUalcman

    lunes, 14 de marzo de 2016 4:29
  • Gracias Leandro una vez mas.

    He conseguido que me haga el post back, mi problema es que ahora no me visualiza bien los datos, recibo este error

    A potentially dangerous Request.Form value was detected from the client (ctl00$ContentPlaceHolder1$txtTextoBlog$hfContenido="...gr erg erg erg "). at System.Web.HttpRequest.ValidateString(String value, String collectionKey, RequestValidationSource requestCollection) at System.Web.HttpRequest.<>c__DisplayClass280_0.b__0(String key, String value) at System.Web.HttpValueCollection.EnsureKeyValidated(String key) at System.Web.HttpValueCollection.GetValues(Int32 index) at System.Collections.Specialized.NameValueCollection.Add(NameValueCollection c) at System.Web.HttpRequest.FillInParamsCollection() at System.Web.HttpRequest.GetParams() at System.Web.HttpRequest.get_Params() at UserControls_wysiwyg.hfContenido_ValueChanged(Object sender, EventArgs e) in d:\dzhosts\localuser\drualcman\www.gym4u.somee.com\UserControls\wysiwyg.ascx.cs:line 292

    La pagina tiene desabilitado el ValidateRequest y en el UserControl donde estoy poniendo esto para que me dispare el evento tambien lo tengo desabilitado.

    Para que lo entendais bien, estoy creando un usercontrol con obciones especiales para mi web que edita en HTML utilizando el javascript nicEditor.

    Si no hago el postback desde javascript, todo me lo hace bien, pero claro no me dispara el evento que es el encargado de visualizar el boton de "publicar" una vez "guardado" el texto con formato HTML.

    Lo estoy haciendo con un user control porque lo utilizo muchas veces dentro de mi web.


    DrUalcman

    El problema diría yo que es un cambio en ASP.net 4.0.  Tal vez por ahí ande el asunto.  Resulta ser que la validación cambió y ahora abarca más cosas.  Trate agregando esto a su web.config según lo recomienda esta página:

    <httpRuntime requestValidationMode="2.0" />

    Jose R. MCP
    Code Samples

    lunes, 14 de marzo de 2016 19:10
    Moderador
  • Muchisimas gracias a todos.

    Ya lo consegui. El tema de lo de

    <httpRuntime requestValidationMode="2.0" />

    ya lo sabia, y realmente fue un fallo mio, ya que pensaba que ya estaba aplicado. Y por eso me estaba volviendo loco.

    Como siempre pongo el codigo ya resumido y organizado para que otros lo puedan disfrutar.

    Codigo en el User Control

    <%@ Control Language="C#" AutoEventWireup="true" CodeFile="wysiwyg.ascx.cs" Inherits="UserControls_wysiwyg" ValidateRequestMode="Inherit" %>
    <script type="text/javascript" src="http://js.nicedit.com/nicEdit-latest.js"></script>
    <script type="text/javascript">
    //<![CDATA[
      var area;
     
      function addArea() {
          area = new nicEditor({
              buttonList: ['bold', 'italic', 'underline', 'strikeThrough', 'subscript', 'superscript',
                           'left', 'center', 'right', 'justify', 'fontFamily', 'fontFormat', 'fontSize',
                           'ol', 'ul', 'indent', 'outdent', 'hr', 'forecolor', 'bgcolor', 'removeformat',
                           'upload', 'save'],
              onSave: function (content, id, instance) {              
                  document.getElementById("<%=hfContenido.ClientID%>").value = content;      
                  __doPostBack('<%=hfContenido.ClientID%>', content);
              }
          }).panelInstance('<%= Texto.ClientID %>');
      }
     
        bkLib.onDomLoaded(function () { addArea(); });    
        //]]>
    
      </script>
    
      <!-- Salvar el contenido de los que se esta escribirneo -->
      <asp:HiddenField ID="hfContenido" runat="server" OnValueChanged="hfContenido_ValueChanged" />

    Codigo en el Code Behind

        #region evento
        public event EventHandler Guardado;
    
        protected virtual void Guardar(object sender)
        {
            if (this.Guardado != null)
                this.Guardado(sender, new EventArgs());
        }
        #endregion
    
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                hfContenido.Value = "";
            }
            else
            {
                try
                {
                    if (Page.Request.Params["__EVENTTARGET"] == hfContenido.ClientID)
                    {
                        string dat = Page.Request.Params["__EVENTARGUMENT"].ToString();
                        if (!string.IsNullOrEmpty(dat))
                        {
                            hfContenido.Value = dat;
                        }
                        else
                        {
                            hfContenido.Value = "";
                        }
                    }
    
                }
                catch (Exception ex)
                {
                    smsError.Text = "Genero error.<br /><p>" + ex.Message + "</p><br /><p>" + ex.StackTrace + "</p>";
                    hfContenido.Value = "";
                }
            }
    
        }
    
        protected void hfContenido_ValueChanged(object sender, EventArgs e)
        {
            if (!string.IsNullOrEmpty(hfContenido.Value))
            {
                //Text = hfContenido.Value;
                Guardar(sender);            //invocar al evento
            }
        }


    Si a alquien se le ocurre alguna forma de evitar tener que poner el requestValidationMode="2.0" todas las ideas seran bien recibidas.

    Puedes descargar el UserControl que he creado aqui. Mas informacion aqui en mi blog.


    DrUalcman

    martes, 15 de marzo de 2016 0:54