none
Capturar valor de un objeto como pasado como parametro de WebForms a Javascript RRS feed

  • Pregunta

  • Estimados muy buenas , intentare ser breve y conciso :

    Como bien menciona el titulo quiero pasar un objeto como parametro desde asp.net a javascript, esto estoy lograndolo,el tema es que no logro capturar el valor en javascript adecuadamente, a continuación les muestro lo intentado.

                TestObj = new UnidadesMedidaEntities();
                    TestObj.IdUnidadMedida = Convert.ToInt32(UnidadesMedida.DataKeys[i].Values["IdUnidadMedida"]);  
                    TestObj.Descripcion = UnidadesMedida.DataKeys[i].Values["Descripcion"].ToString();
                    
                    TestObj.NumUnidad = Convert.ToInt32(UnidadesMedida.DataKeys[i].Values["NumUnidad"]);           
                    ScriptManager.RegisterStartupScript(this, typeof(Page), "popup", "ModalPopup2('" + TestObj + "');", true);

    Obviamente TestObj se carga con los valores necesarios lo cual esta constatado y luego en Javascript : 

    function ModalPopup2(TestObj) {
              //ESTO TAMBIEN LO INTENTE Y NO FUNCIONO
        //var obj = JSON.parse(TestObj);
        $('#myModal2').modal('show');
        document.getElementById('Text1').innerHTML = TestObj.Descripcion;
        if (TestObj.Descripcion == "undefined") {
                document.getElementById('Text1').innerHTML = 'cualquier cosa';
                alert(TestObj[0]);
                }
                else {
            document.getElementById('Text1').innerHTML = TestObj.Descripcion;}
              
    }

    A continuacion el debug 

    La idea de esto es cargar un modalpopup con los valores que obtengo de un gridview para hacer la modificacion ahi mismo y evitar el postback.

    Aguardo sus valiosa ayuda.

    


    Luciano Leonel

    lunes, 11 de junio de 2018 1:46

Respuestas

  • El problema es que en C# estás concatenando el testObj:

    "ModalPopup2('" + TestObj + "');",

    ¿Qué hace C# cuando concatenas un objeto en un string? Pues llama al método .ToString() del objeto, y concatena el string resultante. ¿Y qué hace .ToString() si en tu objeto no has hecho un override de ese método? Pues ejecuta el .ToString de la clase madre, que en última instancia es System.Object, y el .ToString de System.Object devuelve el nombre de la clase. Obviamente, ese nombre no le sirve para nada al javascript, donde lo que quieres obtener es el contenido de la clase.

    Si no quieres pasar uno por uno los campos individuales del objeto, sino el objeto entero, el truco es serializarlo en JSON, y pasar else JSON al javascript, que sabe deserializarlo y convertirlo de vuelta en un objeto. Esto requiere usar un serializador JSON en tu programa; hay un par de ellos en .Net, pero es más típico usar alguna librería tal como Newtonsoft.Json, que se instala como paquete NuGet.

    Aqui tienes un ejemplo que usa el DataContractJsonSerializer:

    https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/how-to-serialize-and-deserialize-json-data

    El principio de funcionamiento sería similar usando otras librerías, aunque cambiaría la llamada al método que serializa. El ejemplo anterior serializa el objeto en un Stream y luego lo deserializa desde el Stream. En tu caso concreto, lo pasarías a un string, y ese string lo pondrías entre comillas y se lo pasarías al javascript.

    lunes, 11 de junio de 2018 6:10
  • Bueno Alberto desde ya un millon de Gracias por la orientacion para llegar a la solucion , a continuacion dejo el codigo por si les puede servir  

     ListobjUnidadesMedida = ListobjUnidadesMedida == null ? new List<UnidadesMedidaEntities>() : ListobjUnidadesMedida;
                    ListobjUnidadesMedida.Add(TestObj);
                    var json = JsonConvert.SerializeObject(ListobjUnidadesMedida);
    
                    ScriptManager.RegisterStartupScript(this, typeof(Page), "popup", "ModalPopup2('" + json + "');", true);

    y en JS 

    function ModalPopup2(TestObj) {
        var obj = JSON.parse(TestObj);
        $('#myModal2').modal('show');
        var id = obj[0].Descripcion;
        document.getElementById('kk').innerHTML = id;
        if (obj[0].Descripcion == "undefined") {
                document.getElementById('Text1').innerHTML = 'cualquier cosa';
                alert(TestObj[0]);
                }
                else {
            document.getElementById('Text1').innerHTML = obj[0].Descripcion;
                }
    }



    Luciano Leonel

    • Marcado como respuesta Luciano Leonel martes, 12 de junio de 2018 16:53
    martes, 12 de junio de 2018 14:43

Todas las respuestas

  • El problema es que en C# estás concatenando el testObj:

    "ModalPopup2('" + TestObj + "');",

    ¿Qué hace C# cuando concatenas un objeto en un string? Pues llama al método .ToString() del objeto, y concatena el string resultante. ¿Y qué hace .ToString() si en tu objeto no has hecho un override de ese método? Pues ejecuta el .ToString de la clase madre, que en última instancia es System.Object, y el .ToString de System.Object devuelve el nombre de la clase. Obviamente, ese nombre no le sirve para nada al javascript, donde lo que quieres obtener es el contenido de la clase.

    Si no quieres pasar uno por uno los campos individuales del objeto, sino el objeto entero, el truco es serializarlo en JSON, y pasar else JSON al javascript, que sabe deserializarlo y convertirlo de vuelta en un objeto. Esto requiere usar un serializador JSON en tu programa; hay un par de ellos en .Net, pero es más típico usar alguna librería tal como Newtonsoft.Json, que se instala como paquete NuGet.

    Aqui tienes un ejemplo que usa el DataContractJsonSerializer:

    https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/how-to-serialize-and-deserialize-json-data

    El principio de funcionamiento sería similar usando otras librerías, aunque cambiaría la llamada al método que serializa. El ejemplo anterior serializa el objeto en un Stream y luego lo deserializa desde el Stream. En tu caso concreto, lo pasarías a un string, y ese string lo pondrías entre comillas y se lo pasarías al javascript.

    lunes, 11 de junio de 2018 6:10
  • Gracias por la respuesta y por la explicación Alberto ,hoy lo voy a estar probando a ver si logro hacerlo funcionar y estaré comentando como me fue.

    Luciano Leonel

    • Marcado como respuesta Luciano Leonel martes, 12 de junio de 2018 1:15
    • Desmarcado como respuesta Luciano Leonel martes, 12 de junio de 2018 1:15
    lunes, 11 de junio de 2018 16:26
  • Bueno Alberto desde ya un millon de Gracias por la orientacion para llegar a la solucion , a continuacion dejo el codigo por si les puede servir  

     ListobjUnidadesMedida = ListobjUnidadesMedida == null ? new List<UnidadesMedidaEntities>() : ListobjUnidadesMedida;
                    ListobjUnidadesMedida.Add(TestObj);
                    var json = JsonConvert.SerializeObject(ListobjUnidadesMedida);
    
                    ScriptManager.RegisterStartupScript(this, typeof(Page), "popup", "ModalPopup2('" + json + "');", true);

    y en JS 

    function ModalPopup2(TestObj) {
        var obj = JSON.parse(TestObj);
        $('#myModal2').modal('show');
        var id = obj[0].Descripcion;
        document.getElementById('kk').innerHTML = id;
        if (obj[0].Descripcion == "undefined") {
                document.getElementById('Text1').innerHTML = 'cualquier cosa';
                alert(TestObj[0]);
                }
                else {
            document.getElementById('Text1').innerHTML = obj[0].Descripcion;
                }
    }



    Luciano Leonel

    • Marcado como respuesta Luciano Leonel martes, 12 de junio de 2018 16:53
    martes, 12 de junio de 2018 14:43