none
Javascript chamando função do Codebehind RRS feed

  • Pergunta

  • Pessoal.
    Como posso chamar uma função c# (server side) de dentro de uma função javascript (client side)?
    Grato por qualquer auxílio....




    Notepad na mão e uma idéia na cabeça......Se foi útil, marca lá.... Me ajuda que eu marco também... heheheh
    quarta-feira, 14 de outubro de 2009 18:45

Respostas

  • Oi,

    Tem alguns trechos em http://forums.asp.net/t/1159094.aspx que explicam.

    Basicamente :

    1) Habilitar enablepagemethods

    2) Utilizar webmethod em um método shared

    3) Utilizar a classe PageMethods


    []'s

    Dennes
    * Treinamento de ASP.NET 3.5 dia 24/10 - Apenas 12x R$ 70,88 - Inscreva-se em http://www.bufaloinfo.com.br/cursos/aspnet2.asp

    * Treinamento de Introdução a OO e Framework .NET c/C# dia  17/10 - Apenas 12 R$ 42,53  Inscreva-se em http://www.bufaloinfo.com.br/cursos/fundamentosOOFramework.asp

    Tel : (11) 3170-3056 (21)9240-5134  E-Mail: contato arroba bufaloinfo.com.br
    http://www.bufaloinfo.com.br


    Dennes - Se resolveu, classifique a mensagem, por favor - [http://www.bufaloinfo.com.br] NOVO DVD Segurança no ASP.NET : http://www.bufaloinfo.com.br/LearingSeriesSegurancaASPNET2.asp
    • Marcado como Resposta Glauber Rocha quinta-feira, 15 de outubro de 2009 18:14
    quarta-feira, 14 de outubro de 2009 18:56
  • Para capturar o evento da tecla você já sabe através dessa thread(que você mesmo criou):
    http://social.msdn.microsoft.com/Forums/pt-BR/aspnetpt/thread/0631f1e2-1db6-49da-bc32-14d65c3cbc0d

    Agora basta chamar os eventos do codebehind dentro desses códigos para capturar o evento de tecla em javascript.

    function disparaEvento()
    {
       if (window.event.keyCode == 39)
       {
           //window.open('minhaPagina.aspx', 'ifrName');
           PageMethods.SeuMetodo(param1, param2);
       }
    }
    • Marcado como Resposta Glauber Rocha quinta-feira, 15 de outubro de 2009 18:14
    quinta-feira, 15 de outubro de 2009 13:30
  • Bom pessoal.

    Segui as recomendações aqui e no entanto apresentou um erro.
    Erro: 'PageMethods' não está definido
    Engraçado que fiz num projeto teste e funcionou, qdo transportei para o projeto verdadeiro apresentou este erro acima.


    No javascript chamo minha função assim:

    function disparaEvento() {
        if (window.event.keyCode == 39) {
           PageMethods.reload();
        }
    }

    Dentro do codebehind montei assim o método reload

    [System.Web.Services.WebMethod]
    public   void reload()
            {
                loadGrid();
            }

    O que pode ser????
    Grato antecipadamente....



    Notepad na mão e uma idéia na cabeça......Se foi útil, marca lá.... Me ajuda que eu marco também... heheheh
    • Marcado como Resposta Glauber Rocha quinta-feira, 15 de outubro de 2009 18:14
    quinta-feira, 15 de outubro de 2009 15:56
  • Você colocou o código do codebehind como static ?

    Coloca assim:

    [System.Web.Services.WebMethod]
    public static void reload()
    {
         loadGrid();
    }
    • Marcado como Resposta Glauber Rocha quinta-feira, 15 de outubro de 2009 18:13
    quinta-feira, 15 de outubro de 2009 16:24
  • Oi,

    Tem que ser static, o problema é que você não pode chamar elementos não static de elementos static, dai loadgrid teria que ser static também e mais um monte de coisas.

    Mas vamos retroceder um pouco... por que mesmo está chamando loadgrid ali ? Normalmente uma chamada de método assim (do client para o code-behind) é para chamar uma função que vai retornar um valor ou um conjunto de valores, aquele loadgrid ali não tem como funcionar.  Qual era realmente a intenção ?

    []'s

    Dennes
    * Treinamento de ASP.NET 3.5 dia 24/10 - Apenas 12x R$ 70,88 - Inscreva-se em http://www.bufaloinfo.com.br/cursos/aspnet2.asp

    * Treinamento de Introdução a OO e Framework .NET c/C# dia  17/10 - Apenas 12 R$ 42,53  Inscreva-se em http://www.bufaloinfo.com.br/cursos/fundamentosOOFramework.asp

    Tel : (11) 3170-3056 (21)9240-5134  E-Mail: contato arroba bufaloinfo.com.br
    http://www.bufaloinfo.com.br


    Dennes - Se resolveu, classifique a mensagem, por favor - [http://www.bufaloinfo.com.br] NOVO DVD Segurança no ASP.NET : http://www.bufaloinfo.com.br/LearingSeriesSegurancaASPNET2.asp
    • Marcado como Resposta Glauber Rocha quinta-feira, 15 de outubro de 2009 18:13
    quinta-feira, 15 de outubro de 2009 17:13
  • Oi,

    Por esse caminho não dá.

    Seu método chamado via javascript não pode fazer outras mudanças na página, ele deve apenas retornar um valor. Pode até retornar um bloco de HTML que você jogue dentro da página, as vezes é necessário, mas não sei se tão fundamental para seu caso.

    Talvez fosse o caso de mudar totalmente o ponto de vista e pensar em updatepanel.

    []'s

    Dennes
    * Treinamento de ASP.NET 3.5 dia 24/10 - Apenas 12x R$ 70,88 - Inscreva-se em http://www.bufaloinfo.com.br/cursos/aspnet2.asp

    * Treinamento de Introdução a OO e Framework .NET c/C# dia  17/10 - Apenas 12 R$ 42,53  Inscreva-se em http://www.bufaloinfo.com.br/cursos/fundamentosOOFramework.asp

    Tel : (11) 3170-3056 (21)9240-5134  E-Mail: contato arroba bufaloinfo.com.br
    http://www.bufaloinfo.com.br


    Dennes - Se resolveu, classifique a mensagem, por favor - [http://www.bufaloinfo.com.br] NOVO DVD Segurança no ASP.NET : http://www.bufaloinfo.com.br/LearingSeriesSegurancaASPNET2.asp
    • Marcado como Resposta Glauber Rocha quinta-feira, 15 de outubro de 2009 18:13
    quinta-feira, 15 de outubro de 2009 17:40
  • Através do click do botão você consegue fazer isso facilmente.


    function disparaEvento()
    {
        if (window.event.keyCode == 39)
        {
           var btn = document.getElementById(btnName);
           if (btn) btn.click();
        }
    }

    E no codebeding o click do seu botão faz o:

    Timer1.Enable = true;
    • Marcado como Resposta Glauber Rocha quinta-feira, 15 de outubro de 2009 18:13
    quinta-feira, 15 de outubro de 2009 17:52
  • Valeu pessoal.
    Muito obrigado a vcs.
    :)

    Acabei seguindo a direção de disparar o evento do botão apresentada pelo Kaue.
    O resto ficou fácil.
    Vlw mesmo.....




    Notepad na mão e uma idéia na cabeça......Se foi útil, marca lá.... Me ajuda que eu marco também... heheheh
    • Marcado como Resposta Glauber Rocha quinta-feira, 15 de outubro de 2009 18:13
    quinta-feira, 15 de outubro de 2009 18:13

Todas as Respostas

  • Oi Glauber,

             Essa thread aqui do fórum explica isso:
             http://social.msdn.microsoft.com/Forums/pt-BR/aspnetpt/thread/94015089-fa7a-4c14-8c70-79b33ff003b0 

             Espero que ajude.
    quarta-feira, 14 de outubro de 2009 18:55
  • Oi,

    Tem alguns trechos em http://forums.asp.net/t/1159094.aspx que explicam.

    Basicamente :

    1) Habilitar enablepagemethods

    2) Utilizar webmethod em um método shared

    3) Utilizar a classe PageMethods


    []'s

    Dennes
    * Treinamento de ASP.NET 3.5 dia 24/10 - Apenas 12x R$ 70,88 - Inscreva-se em http://www.bufaloinfo.com.br/cursos/aspnet2.asp

    * Treinamento de Introdução a OO e Framework .NET c/C# dia  17/10 - Apenas 12 R$ 42,53  Inscreva-se em http://www.bufaloinfo.com.br/cursos/fundamentosOOFramework.asp

    Tel : (11) 3170-3056 (21)9240-5134  E-Mail: contato arroba bufaloinfo.com.br
    http://www.bufaloinfo.com.br


    Dennes - Se resolveu, classifique a mensagem, por favor - [http://www.bufaloinfo.com.br] NOVO DVD Segurança no ASP.NET : http://www.bufaloinfo.com.br/LearingSeriesSegurancaASPNET2.asp
    • Marcado como Resposta Glauber Rocha quinta-feira, 15 de outubro de 2009 18:14
    quarta-feira, 14 de outubro de 2009 18:56
  • Kaue.
    Neste exemplo postado as funções são executadas a partir de um evento do controle aspx.
    No meu caso não terei este evento para executar o post.
    Tenho um evento client, mas não é num controle onde posso configurar AutoPostBack="True".
    Por isso estou com dificuldades.

    :(




    Notepad na mão e uma idéia na cabeça......Se foi útil, marca lá.... Me ajuda que eu marco também... heheheh
    quarta-feira, 14 de outubro de 2009 19:02
  • Glauber,

              Acho que você deixou passar algum detalhe no link que eu e o Dennes te passamos.
              A não ser que você não tenha explicado direito do que você precisa com certeza esses links te levarão à resposta.

              Olhe nesse link. Está bem claro:
              http://www.dotnetcurry.com/ShowArticle.aspx?ID=109&AspxAutoDetectCookieSupport=1 
    quarta-feira, 14 de outubro de 2009 21:17
  • Minha situação é a seguinte.
    Quando o usuário clicar em uma tecla específica( ' ) terei que executar alguns métodos dentro do codebehind.
    Acontece que o evento de teclar nesta tecla acontece no client.
    E acho que não tem como criar um atributes.add('','') como ocorre nos exemplos.
    E mais, vou precisar criar um web.service para isso?
    Obrigado a todos.




    Notepad na mão e uma idéia na cabeça......Se foi útil, marca lá.... Me ajuda que eu marco também... heheheh
    quinta-feira, 15 de outubro de 2009 13:23
  • Para capturar o evento da tecla você já sabe através dessa thread(que você mesmo criou):
    http://social.msdn.microsoft.com/Forums/pt-BR/aspnetpt/thread/0631f1e2-1db6-49da-bc32-14d65c3cbc0d

    Agora basta chamar os eventos do codebehind dentro desses códigos para capturar o evento de tecla em javascript.

    function disparaEvento()
    {
       if (window.event.keyCode == 39)
       {
           //window.open('minhaPagina.aspx', 'ifrName');
           PageMethods.SeuMetodo(param1, param2);
       }
    }
    • Marcado como Resposta Glauber Rocha quinta-feira, 15 de outubro de 2009 18:14
    quinta-feira, 15 de outubro de 2009 13:30
  • Oi,

    O exemplo que passei em  http://forums.asp.net/t/1159094.aspx não usa attributtes.add, usa o PageMethods. Observe-o em mais detalhes.


    []'s

    Dennes
    * Treinamento de ASP.NET 3.5 dia 24/10 - Apenas 12x R$ 70,88 - Inscreva-se em http://www.bufaloinfo.com.br/cursos/aspnet2.asp

    * Treinamento de Introdução a OO e Framework .NET c/C# dia  17/10 - Apenas 12 R$ 42,53  Inscreva-se em http://www.bufaloinfo.com.br/cursos/fundamentosOOFramework.asp

    Tel : (11) 3170-3056 (21)9240-5134  E-Mail: contato arroba bufaloinfo.com.br
    http://www.bufaloinfo.com.br


    Dennes - Se resolveu, classifique a mensagem, por favor - [http://www.bufaloinfo.com.br] NOVO DVD Segurança no ASP.NET : http://www.bufaloinfo.com.br/LearingSeriesSegurancaASPNET2.asp
    quinta-feira, 15 de outubro de 2009 14:11
  • Bom pessoal.

    Segui as recomendações aqui e no entanto apresentou um erro.
    Erro: 'PageMethods' não está definido
    Engraçado que fiz num projeto teste e funcionou, qdo transportei para o projeto verdadeiro apresentou este erro acima.


    No javascript chamo minha função assim:

    function disparaEvento() {
        if (window.event.keyCode == 39) {
           PageMethods.reload();
        }
    }

    Dentro do codebehind montei assim o método reload

    [System.Web.Services.WebMethod]
    public   void reload()
            {
                loadGrid();
            }

    O que pode ser????
    Grato antecipadamente....



    Notepad na mão e uma idéia na cabeça......Se foi útil, marca lá.... Me ajuda que eu marco também... heheheh
    • Marcado como Resposta Glauber Rocha quinta-feira, 15 de outubro de 2009 18:14
    quinta-feira, 15 de outubro de 2009 15:56
  • Oi,

    Será que está faltando um scriptmanager com enablepagemethods="true" ?

    []'s

    Dennes
    * Treinamento de ASP.NET 3.5 dia 24/10 - Apenas 12x R$ 70,88 - Inscreva-se em http://www.bufaloinfo.com.br/cursos/aspnet2.asp

    * Treinamento de Introdução a OO e Framework .NET c/C# dia  17/10 - Apenas 12 R$ 42,53  Inscreva-se em http://www.bufaloinfo.com.br/cursos/fundamentosOOFramework.asp

    Tel : (11) 3170-3056 (21)9240-5134  E-Mail: contato arroba bufaloinfo.com.br
    http://www.bufaloinfo.com.br


    Dennes - Se resolveu, classifique a mensagem, por favor - [http://www.bufaloinfo.com.br] NOVO DVD Segurança no ASP.NET : http://www.bufaloinfo.com.br/LearingSeriesSegurancaASPNET2.asp
    quinta-feira, 15 de outubro de 2009 16:10
  • Não, acabei de habilitar o pageMethods no scriptmanager e continua o mesmo erro.
    :(


    Notepad na mão e uma idéia na cabeça......Se foi útil, marca lá.... Me ajuda que eu marco também... heheheh
    quinta-feira, 15 de outubro de 2009 16:15
  • Talvez o erro possa estar no local onde você colocou esse código javascript.

    Ele está na sua página mesmo ? ou na MasterPage ?

    Se ele estiver na MasterPage pode ser que ele não esteja encontrando o método codebehind. (Só uma idéia)
    quinta-feira, 15 de outubro de 2009 16:17
  • Kaue. 
    A página em questão não usa masterPage.



    Notepad na mão e uma idéia na cabeça......Se foi útil, marca lá.... Me ajuda que eu marco também... heheheh
    quinta-feira, 15 de outubro de 2009 16:20
  • Oi,

    Lembre-se que javascript é sensível a caixa de letra.

    []'s

    Dennes
    * Treinamento de ASP.NET 3.5 dia 24/10 - Apenas 12x R$ 70,88 - Inscreva-se em http://www.bufaloinfo.com.br/cursos/aspnet2.asp

    * Treinamento de Introdução a OO e Framework .NET c/C# dia  17/10 - Apenas 12 R$ 42,53  Inscreva-se em http://www.bufaloinfo.com.br/cursos/fundamentosOOFramework.asp

    Tel : (11) 3170-3056 (21)9240-5134  E-Mail: contato arroba bufaloinfo.com.br
    http://www.bufaloinfo.com.br


    Dennes - Se resolveu, classifique a mensagem, por favor - [http://www.bufaloinfo.com.br] NOVO DVD Segurança no ASP.NET : http://www.bufaloinfo.com.br/LearingSeriesSegurancaASPNET2.asp
    quinta-feira, 15 de outubro de 2009 16:23
  • Você colocou o código do codebehind como static ?

    Coloca assim:

    [System.Web.Services.WebMethod]
    public static void reload()
    {
         loadGrid();
    }
    • Marcado como Resposta Glauber Rocha quinta-feira, 15 de outubro de 2009 18:13
    quinta-feira, 15 de outubro de 2009 16:24
  • Se coloco como static dá o seguinte erro:
    Error 1 An object reference is required for the non-static field, method, or property 'Projeto.formWeb.loadGrid()'

    Acusa erro e não encontra o método loadGrid();
    :( 



    Notepad na mão e uma idéia na cabeça......Se foi útil, marca lá.... Me ajuda que eu marco também... heheheh
    quinta-feira, 15 de outubro de 2009 17:00
  • Oi,

    Tem que ser static, o problema é que você não pode chamar elementos não static de elementos static, dai loadgrid teria que ser static também e mais um monte de coisas.

    Mas vamos retroceder um pouco... por que mesmo está chamando loadgrid ali ? Normalmente uma chamada de método assim (do client para o code-behind) é para chamar uma função que vai retornar um valor ou um conjunto de valores, aquele loadgrid ali não tem como funcionar.  Qual era realmente a intenção ?

    []'s

    Dennes
    * Treinamento de ASP.NET 3.5 dia 24/10 - Apenas 12x R$ 70,88 - Inscreva-se em http://www.bufaloinfo.com.br/cursos/aspnet2.asp

    * Treinamento de Introdução a OO e Framework .NET c/C# dia  17/10 - Apenas 12 R$ 42,53  Inscreva-se em http://www.bufaloinfo.com.br/cursos/fundamentosOOFramework.asp

    Tel : (11) 3170-3056 (21)9240-5134  E-Mail: contato arroba bufaloinfo.com.br
    http://www.bufaloinfo.com.br


    Dennes - Se resolveu, classifique a mensagem, por favor - [http://www.bufaloinfo.com.br] NOVO DVD Segurança no ASP.NET : http://www.bufaloinfo.com.br/LearingSeriesSegurancaASPNET2.asp
    • Marcado como Resposta Glauber Rocha quinta-feira, 15 de outubro de 2009 18:13
    quinta-feira, 15 de outubro de 2009 17:13
  • A intenção são duas.
    Assim que o usuário teclar ' , (como se fosse uma tecla de atalho), um evento é disparado que atualiza um registro.
    Após atualizado, precisarei recarregar um grid na tela para que os dados exibidos sejam atuais.

    No momento o dado é atualizado qdo o usuário tecla ', mas como o grid não é atualizado, pode causar alguma confusão.
    Por isso quero executar este método: loadGrid().





    Notepad na mão e uma idéia na cabeça......Se foi útil, marca lá.... Me ajuda que eu marco também... heheheh
    quinta-feira, 15 de outubro de 2009 17:22
  • Crie um botão na página e no método Click dele coloque o loadGrid();

    Ao invés de usar o PageMethods, use o document.botao.click();
    quinta-feira, 15 de outubro de 2009 17:34
  • Oi,

    Por esse caminho não dá.

    Seu método chamado via javascript não pode fazer outras mudanças na página, ele deve apenas retornar um valor. Pode até retornar um bloco de HTML que você jogue dentro da página, as vezes é necessário, mas não sei se tão fundamental para seu caso.

    Talvez fosse o caso de mudar totalmente o ponto de vista e pensar em updatepanel.

    []'s

    Dennes
    * Treinamento de ASP.NET 3.5 dia 24/10 - Apenas 12x R$ 70,88 - Inscreva-se em http://www.bufaloinfo.com.br/cursos/aspnet2.asp

    * Treinamento de Introdução a OO e Framework .NET c/C# dia  17/10 - Apenas 12 R$ 42,53  Inscreva-se em http://www.bufaloinfo.com.br/cursos/fundamentosOOFramework.asp

    Tel : (11) 3170-3056 (21)9240-5134  E-Mail: contato arroba bufaloinfo.com.br
    http://www.bufaloinfo.com.br


    Dennes - Se resolveu, classifique a mensagem, por favor - [http://www.bufaloinfo.com.br] NOVO DVD Segurança no ASP.NET : http://www.bufaloinfo.com.br/LearingSeriesSegurancaASPNET2.asp
    • Marcado como Resposta Glauber Rocha quinta-feira, 15 de outubro de 2009 18:13
    quinta-feira, 15 de outubro de 2009 17:40
  • Obrigado pessoal.

    Vou investigar aqui e ver se acho alguma nova direção a seguir.
    Botões de comando já tenho na tela.
    Infelizmente requisitaram esta tecla de atalho.
    Bom, 50% realizado. Já que os dados são alterados, apenas o grid não é atualizado.
    Por acaso tem como via WebMethod eu disparar o  asp:Timer ?
    Já tenho um timer na tela que atualiza meu grid. Se for possível antecipar o momento de 'disparo' do timer acho que atenderia minha necessidade.

    Sabem se tem como?
    Grato.



    Notepad na mão e uma idéia na cabeça......Se foi útil, marca lá.... Me ajuda que eu marco também... heheheh
    quinta-feira, 15 de outubro de 2009 17:48
  • Através do click do botão você consegue fazer isso facilmente.


    function disparaEvento()
    {
        if (window.event.keyCode == 39)
        {
           var btn = document.getElementById(btnName);
           if (btn) btn.click();
        }
    }

    E no codebeding o click do seu botão faz o:

    Timer1.Enable = true;
    • Marcado como Resposta Glauber Rocha quinta-feira, 15 de outubro de 2009 18:13
    quinta-feira, 15 de outubro de 2009 17:52
  • Oi,

    Procure uma forma de disparar o timer via javascript.

    Em casos emergenciais, a função estática poderia gerar HTML que você substituiria no client usando javascript.

    []'s

    Dennes
    * Treinamento de ASP.NET 3.5 dia 24/10 - Apenas 12x R$ 70,88 - Inscreva-se em http://www.bufaloinfo.com.br/cursos/aspnet2.asp

    * Treinamento de Introdução a OO e Framework .NET c/C# dia  17/10 - Apenas 12 R$ 42,53  Inscreva-se em http://www.bufaloinfo.com.br/cursos/fundamentosOOFramework.asp

    Tel : (11) 3170-3056 (21)9240-5134  E-Mail: contato arroba bufaloinfo.com.br
    http://www.bufaloinfo.com.br


    Dennes - Se resolveu, classifique a mensagem, por favor - [http://www.bufaloinfo.com.br] NOVO DVD Segurança no ASP.NET : http://www.bufaloinfo.com.br/LearingSeriesSegurancaASPNET2.asp
    quinta-feira, 15 de outubro de 2009 18:03
  • Valeu pessoal.
    Muito obrigado a vcs.
    :)

    Acabei seguindo a direção de disparar o evento do botão apresentada pelo Kaue.
    O resto ficou fácil.
    Vlw mesmo.....




    Notepad na mão e uma idéia na cabeça......Se foi útil, marca lá.... Me ajuda que eu marco também... heheheh
    • Marcado como Resposta Glauber Rocha quinta-feira, 15 de outubro de 2009 18:13
    quinta-feira, 15 de outubro de 2009 18:13
  • Vou ressuscitar o tópico, ja que tive o mesmo problema com a mensagem de "Erro: 'PageMethods' não definido" e consegui resolver.

    Para funcionar vc precisa estar com o seu método na mesma página q está chamando o javascript, se vc usar a função javascript no .aspx, no caso do click do botão utilize a propriedade OnClientClick="javascript:disparaEvento();"

     

    • Sugerido como Resposta tonny182 segunda-feira, 3 de outubro de 2011 20:50
    segunda-feira, 3 de outubro de 2011 20:34