none
Problemas con el uso de métodos estáticos RRS feed

  • Pregunta

  • Hola

    Tengo el siguiente problema, necesito llenar un modal según el id que seleccione en un dataTable, el id lo obtengo por medio de ajax, el problema es que cuando intento llenar el dropdownlist me dice que no puedo ocupar métodos estáticos dentro de otros que no lo son.

    Alguna idea de como puedo solucionar el tema

    Muchas gracias

      [WebMethod]
            public static bool LlenarDatosDLLModal(String rut)
            {
                Usuario usuario_actual = UsuarioLN.getInstance().SeleccionarUsuario(rut);
                DropDownList ddl = new DropDownList();
                /* Llenado de los valores actuales del usuario logeado (Dropdown List Empresa, Dropdown List Perfil y Dropdown List Departamento)*/
               
                InicarLLenadoDepartamentoModal();
                ddlDeptoModal.SelectedValue = usuario_actual.Departamento.ToString();
                InicarLLenadoEmpresaModal();
                ddlEmpresaModal.SelectedValue = usuario_actual.Empresa.ToString();
                InicarLLenadoPerfilModal();
                ddlPerfilModal.SelectedValue = usuario_actual.Rol.ToString();
                return true;
            }       
    viernes, 20 de diciembre de 2019 18:55

Respuestas

  • Estás pensando en la forma en que funcionaría una aplicación de escritorio. En una aplicación web no tiene ningún sentido lo que estás intentando hacer. Piensa en cómo funciona internamente: Cuando el navegador envía una petición, se instancia una clase en el servidor, se ejecutan los métodos, y como resultado se sirve un HTML al navegador. En ese momento se destruye y deja de existir la clase en el servidor. Mientras estás viendo la página en el navegador, la instancia de la clase ya no existe. Por lo tanto, no puedes pedirle a un método estático que cambie datos de esa instancia, esperando que se vean los cambios en pantalla. Esto funcionaría en una aplicación de escritorio pero no vale para aplicaciones web, en las que lo que se ve en pantalla no está conectado con una instancia en el servidor. La instancia se crea y se destruye a cada postback, y no existe enter medias de dos postbacks.
    viernes, 20 de diciembre de 2019 20:22
  • No puedes hacer eso porque los otros métodos (InicarLLenadoDepartamentoModal(), InicarLLenadoEmpresaModal() y InicarLLenadoPerfilModal()) no son estáticos (y quiza utilicen una instancia de clase). ¿Podrías incluir el código de esos métodos?

    Lo que tienes que hacer es generar versiones estáticas de esas funciones

    Saludos.


    viernes, 20 de diciembre de 2019 20:26
  • Muchas gracias por responder, 

    Le comento más detalladamente mi problema para ver si me sugiere alguna otra solución.

    Tengo un DataTable con un listado de instancias, al final del row tengo un botón para actualizar los datos de la instancia que esta específicamente en ese row. Tengo un modal que me trae los datos de esa instancia, en el modal tengo 2 dropdownlist y lo que quiero es que el valor seleccionado en dichos dropdownlist sea  el que corresponde en cada caso pero igualmente el restos de los valores deben ser los que están en la BD.

    Alguna idea ?

    graias

    viernes, 20 de diciembre de 2019 20:39
  • Para poder hacer eso sin usar un postback (puesto que al mencionar el modal presumo que no quieres recargar la página completa) es necesario recurrir a programar con javascript en el lado cliente. Lo que se hace es obtener los datos de base de datos mediante una llamada AJAX al servidor. Esta llamada sí que puede llamar al método estático, puesto que el código de acceso a base de datos puede perfectamente ejecutarse sin necesitar llamar a ningún miembro de instancia. Y luego, una vez que el método devuelve los datos de base de datos, el resto de los datos que deben venir de los dropdownlist se obtienen en lado cliente accediendo a esos dropdowns mediante javascript. Esos datos son los que no se pueden leer en lado servidor, puesto que en el momento en que se hace esta lectura el servidor no tiene esos valores.
    sábado, 21 de diciembre de 2019 9:51
  • hola

    El problema se presenta porque mezclas controles de asp.net con los de html, si estas usando el datatable que es un componente jquery y ajax no debes usar en el popup un DropDownList, ahi esta el problema

    Debes usar un

    <select >

    y debes cargar los items de este usando tambien ajax

    Analiza este ejemplo

    [ASP.NET] PopUp Edición - Usando Jquery UI Dialog

    si bien no uso del datatable para el grid, valida como cargo los combos en el popup

    veras que los items de los combos se generan mediante ajax y no desde codigo servidor

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 23 de diciembre de 2019 17:46

Todas las respuestas

  • Estás pensando en la forma en que funcionaría una aplicación de escritorio. En una aplicación web no tiene ningún sentido lo que estás intentando hacer. Piensa en cómo funciona internamente: Cuando el navegador envía una petición, se instancia una clase en el servidor, se ejecutan los métodos, y como resultado se sirve un HTML al navegador. En ese momento se destruye y deja de existir la clase en el servidor. Mientras estás viendo la página en el navegador, la instancia de la clase ya no existe. Por lo tanto, no puedes pedirle a un método estático que cambie datos de esa instancia, esperando que se vean los cambios en pantalla. Esto funcionaría en una aplicación de escritorio pero no vale para aplicaciones web, en las que lo que se ve en pantalla no está conectado con una instancia en el servidor. La instancia se crea y se destruye a cada postback, y no existe enter medias de dos postbacks.
    viernes, 20 de diciembre de 2019 20:22
  • No puedes hacer eso porque los otros métodos (InicarLLenadoDepartamentoModal(), InicarLLenadoEmpresaModal() y InicarLLenadoPerfilModal()) no son estáticos (y quiza utilicen una instancia de clase). ¿Podrías incluir el código de esos métodos?

    Lo que tienes que hacer es generar versiones estáticas de esas funciones

    Saludos.


    viernes, 20 de diciembre de 2019 20:26
  • Muchas gracias por responder, 

    Le comento más detalladamente mi problema para ver si me sugiere alguna otra solución.

    Tengo un DataTable con un listado de instancias, al final del row tengo un botón para actualizar los datos de la instancia que esta específicamente en ese row. Tengo un modal que me trae los datos de esa instancia, en el modal tengo 2 dropdownlist y lo que quiero es que el valor seleccionado en dichos dropdownlist sea  el que corresponde en cada caso pero igualmente el restos de los valores deben ser los que están en la BD.

    Alguna idea ?

    graias

    viernes, 20 de diciembre de 2019 20:39
  • Para poder hacer eso sin usar un postback (puesto que al mencionar el modal presumo que no quieres recargar la página completa) es necesario recurrir a programar con javascript en el lado cliente. Lo que se hace es obtener los datos de base de datos mediante una llamada AJAX al servidor. Esta llamada sí que puede llamar al método estático, puesto que el código de acceso a base de datos puede perfectamente ejecutarse sin necesitar llamar a ningún miembro de instancia. Y luego, una vez que el método devuelve los datos de base de datos, el resto de los datos que deben venir de los dropdownlist se obtienen en lado cliente accediendo a esos dropdowns mediante javascript. Esos datos son los que no se pueden leer en lado servidor, puesto que en el momento en que se hace esta lectura el servidor no tiene esos valores.
    sábado, 21 de diciembre de 2019 9:51
  • hola

    El problema se presenta porque mezclas controles de asp.net con los de html, si estas usando el datatable que es un componente jquery y ajax no debes usar en el popup un DropDownList, ahi esta el problema

    Debes usar un

    <select >

    y debes cargar los items de este usando tambien ajax

    Analiza este ejemplo

    [ASP.NET] PopUp Edición - Usando Jquery UI Dialog

    si bien no uso del datatable para el grid, valida como cargo los combos en el popup

    veras que los items de los combos se generan mediante ajax y no desde codigo servidor

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 23 de diciembre de 2019 17:46