none
Paginas .ascx. Não consigo acessar os eventos destas paginas.

    Question

  • Estou trabalhando em um projeto novo e não conheço muita coisa de C#, nem asp.Net, e sou o unico da empresa que por enquanto estou trabalhando com C#, o resto ta tudo rodando em php. Minha area de conhecimento é em Java Web (JSP, JSF).  E o projeto que estou trabalhando foi iniciado por um consultor que nunca vi.

    Muito bem, meu problema é o seguinte, tenho q continuar este projeto.

    Ele foi iniciado com a intenção de não possibilitar o acesso e nenhum de seus programas direto pela URL como por exemplo "http://www.meuprojeto.com/programa1.aspx", os unicos programas que podem ser acessados dessa maneira são o Default.aspx e o Login.aspx. os outros programas vão ter que ser todos .ascx. Até aqui todo bem.

    A solução do consultor é incluir os .ascx dentro do Default.aspx, tudo certo, já haviam alguns programas sendo acessados desta maneira.

    Comecei a implementar os programas realmente já que eles eram apenas paginas html mostrando de podiam ser acessados desta maneira. 

    Fiz um pequeno cadastro com um botão Salvar onde fui no programa1.ascx.cs e botei o evento bt_Salvar_Click, e implementei alguns testes, mas o que pude perceber é que de nenhuma maneira eu consigo executar os comandos do método bt_Salvar_Click, estou achando que como está pagina ascx é incluida em uma outra pagina aspx, o seu .cs não pode ser encontra. Gostaria de saber se isso realmente acontece. E se sim. De que outra maneira posso revolver meu problema.

    Desde já agradeço. 

    E fico no aguardo, já revirei a net e nada^^

    Att. Fernando

    Wednesday, November 16, 2011 7:28 PM

All replies

  • Fala rapaz,

    Tenho algumas sugestões e questionamentos.

    1 - Não entendi a razão de ser todo feito com user controls. Este motivo de não ser acessado diretamente é meio estranho. O que ele quis dizer com isso?

    2 - Você pode programar os eventos do user control diretamente dentro deles.

    3 - Esses eventos não são acessíveis diretamente, mas você pode construir delegates para que os eventos sejam associados a métodos da páginas.

    4 - Se mesmo assim você quiser fazer desta maneira, perceba que sua página Default.aspx ficará cheia de métodos, porque todos os eventos de todos os usercontrols estarão associados a esta pagina.

    OK?


    Francisco Gonçalves
    Blog: franciscogoncalves.wordpress.com
    Wednesday, November 16, 2011 7:47 PM
  • Bom dia amigo, os arquivos ascx são referentes ao que é chamado de controle no ASP.NET, nesse seu caso mais especificamente um UserControl, que simplesmente é um grupo de controle agrupados no ascx visando facil reaproveitamento.

    Funciona como um aspx normal e cada um tem seu proprio arquivo .ascx.cs, é neste arquivo onde você esta colocando o evento de Click?

    Faça o seguinte para ver se esta ok: No seu ascx arraste um botão do "Tool box", alterne a exibição para modo Design(para ver a tela desenhada) e dê um duplo clique no seu botão. Ele irá automaticamente gerar o evento padrão do componente, que no caso de um Button é o Button_Click e irá leva-lo para o ascx.cs exibindo o evento ja montado.

    Verifique se o evento também aparece no seu markup, veja:

    <asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />
    

    Poste seu código para dar uma olhada. abraços


    Rodrigo Reis Ferreira
    Microsoft Certified
    Wednesday, November 16, 2011 7:50 PM
  • Bom amigo, 

    Primeiramente obrigado pela atenção,

    O que acontece é o seguinte, também achei muito "deselegante" está solução, pois não uso mais o arquivo Site.master e praticamente uso o Default.aspx em seu lugar mantendo todo o template nele, como não conheço muito ainda de asp.Net, faço da maneira em que aprendo mais sempre gosto de fazer da maneira mais "elegante" possível.

    Então gostaria de algumas dicas de como fazer isso, de uma maneira mais "elegante", talvez até mesmo sem usar o ascx, que como vocês bem disseram são apenas controllers asp, e não tem especificamente esta finalidade.

    Que sugestões vocês podem me dar de um padrão a ser seguido onde eu possa manter minha paginas privadas a somente os usuários com os privilégios exigidos possam ter acesso a elas?

    Att. Fernando. 


    Fernando
    Thursday, November 17, 2011 10:21 AM
  • Bem o que estou tentando fazer é manter minhas paginas privadas aos meus usuários logados e com permissões de visualiza-las, não deixando elas serem acessadas diretamente via URL. A primeira maneira proposta foi a comentada anteriormente, que não parece ser a melhor. Gostaria de saber outras maneiras melhor de fazer isso, ou como fazer isto desta maneira mesmo se for uma maneira correta.

    Este é o .asp:

    <asp:Panel ID="PainelPrincipal" runat="server"> // <<-- aqui a tag do painel onde eu insiro os ascx dentro do aspx
    

    Este o .asp.cs:

            public void  RenderUserControl(string path)
            {
                Page pageHolder = new Page();
                Control viewControl = pageHolder.LoadControl(path);
                PainelPrincipal.Controls.Clear();
                PainelPrincipal.Controls.Add(viewControl);
            }
    
            protected override void OnPreInit(EventArgs e)
            {
                if (Session["Destino"] != null)
                {
                    RenderUserControl(Session["Destino"].ToString());
                }
                Session["Destino"] = null;
    
                Menu1.ItemClick += new DevExpress.Web.ASPxMenu.MenuItemEventHandler(OnItemClick);
    
                base.OnPreInit(e);
            }
    
            protected void Page_Load(object sender, EventArgs e)
            {
                if (IsPostBack)
                {
                    OnPreInit(e);
                }
            }
    

    Este é o código que insere as paginas ascx dentro do painel da pagina aspx.

    O button em minha pagina ascx:

    <dx:ASPxButton ID="btSalvar" runat="server" Text="Salvar" 
                  onclick="btSalvar_Click">
              </dx:ASPxButton>
    

     

    O evento na ascx.cs:

     

            protected void btSalvar_Click(object sender, EventArgs e)
            {
                string senhaAtual = tbSenhaAtual.Text;
                string novaSenha = tbNovaSenha.Text;
                string confirmaSenha = tbConfirmaSenha.Text;
                string session = CriptoHelper.Decrypt(Session["STX1"].ToString(), true);
    
                if (novaSenha == confirmaSenha)
                {
                    lbAlerta.Text = session;
                    //var senhaAlterada = gs.AlterarSenha(senhaAtual, novaSenha);
                }
                else
                {
                    lbAlerta.Text = "Nova senha não é igual a confirma senha. Preencha novamente.";
                }
                Session["Destino"] = "~/Programas/PR0001.ascx";
                Response.Redirect(Request.RawUrl);
            }
    

     


    postei só as partes ligadas ao problema para não gerar muita confusão.

    Se puderem me auxiliar Agradeço.

     

    Att. Fernando


    Fernando
    • Edited by NotNet Thursday, November 17, 2011 10:47 AM
    Thursday, November 17, 2011 10:44 AM
  • Fala Fernando.

    Existe uma forma muito simples e elegante de fazer a proteção de determinadas páginas.

    Vamos lá.

    1 - User Control (na minha opinião) Serve para reaproveitamento de telas (que não é esse o nosso caso). Então vamos utilizar páginas comuns mesmo (aspx).

    2 - Você deve estruturar as pastas e páginas de acordo com as permissões de acesso.. exemplo...

            Pasta > Administrativo

                              -- Administracao.aspx

                              -- controle.aspx

            Pasta > Cliente

                              -- Compra.aspx

                              -- Relatorio.aspx

    3 - Dentro de cada pasta você poderá criar um web.config contendo as permissões de acesso. 

         Segue neste artigo como fazer isso: http://www.macoratti.net/aspn_fbs1.htm

        EX: 

    <system.web>
    <authorization>
    	<deny users="?" />
    </authorization>
    </system.web>
    

     

     

    4 - Crie uma página de login simples.. Neste link também ensina isto: http://www.macoratti.net/aspn_fbs1.htm

         Configure o web.config da pasta raiz assim:

     

    <system.web>
    	<authentication mode="Forms">
    		<forms name="Exemplo" loginUrl="login.aspx" />
    	</authentication>
    </system.web>
    

     

    Não daria para explicar passo a passo aqui no forum.. pois são muitas etapas.. Mas o artigo do link esta muito bem explicado..

    OK?

    Tenta ai!!

    PS: Não esqueça de marcar como respondido todas as questões que vc acha que foi respondida nesta thread.

     

     

     

     


    Francisco Gonçalves
    Blog: franciscogoncalves.wordpress.com
    Thursday, November 17, 2011 11:14 AM
  • Hum..acho que entendi o problema, na verdade são duas situações diferentes, uma é o fato de que os eventos dos controle não estão sendo acessados no seu ascx.cs e o outro é que você precisa de uma solução de autorização para suas páginas, correto?

    1° Problema com os eventos

    Aparentemente está tudo sendo feito de forma correta, você tem seu aspx, neste aspx você declarou o controle, e no controle você tem um button, e no ascx.cs o evento de Click do button. Só apra confirmar, não vi o código de declaração do controle no aspx, tem ele ai? Seria algo assim:

    No topo do ASPX

    <%@ Register TagPrefix="My" TagName="UserInfoBoxControl" Src="~/WebUserControlCache.ascx" %>
    


    E no corpo do ASPX

    <My:UserInfoBoxControl runat="server" ID="MyUserInfoBoxControl2" />
    

    Confere? Para ter certeza que esta entrando no evento, você ja colocou um breakpoint no código do ascx.cs para ver se esta passando por dentro do  método?

    2° Problema de Autorização

    Bloquear os usuário utilizando os ascx realmente não é a forma adequada de fazer controle de acesso, a forma ideal com certeza seria utilizando o Membership disponibilizado pela Microsoft, não que você não possa criar tudo do zero mas acredito que está não seja opção no momento ja que demanda muito tempo e um conhecimento mais aprofudado do tema.

    Da para falar muita coisa sobre o Membership mas vou tentar me manter no que pode te ajudar a resolver a situação:

    O Mermbership provê as bibliotecas e ferramentas necessárias para você faça a autenticação e autorização dos usuário em sua aplicação. Basicamente envolve a geração de um banco de dados de controle de usuários, permissões, grupos, papéis, perfis, entre outras coisas, um conjunto de classe para que você utilize em seu code-behind como por exemplo, classe com métodos de busca de usuários por nome, por id, teste se o usuário pertence ou não a um determinado grupo, e muito mais.

    Figura: Banco de Dados do Membership(gerado pelo comando aspnet_regiis.

    Provê controles no "Tool box"(Login) do Visual Studio para criar telas de alteração de dados, recuperação de senha, formulário de login, exibição de status,etc. E através do menu "Project">"ASP.NET Configuration" no Visual Studio lhe dará  uma interface de administração de todas as informações do banco e do web.config referente a autenticação e autorização.

    Porque resolve seu problema: o Membership trabalhá com o conceito de permissões em pastas. Então digamos que você tenha um sistema onde existirá telas de administração e telas públicas. Você cria então duas pastas "Admin" e "Public" por exemplo, através do "ASP.NET Configuration" você criaria um grupo chamado "Administradores" e outro "Pessoas Comuns", cria então um usuário administrador e o coloca no grupo "Administradores", cria então seus usuários públicos e os coloca no grupo "Pessoas Comuns".

    Agora a parte legal, para cada pasta você pode determinar quais grupos ou usuários possuem permissão(e bloquear usuários anônimos), então se uma pessoa do grupo "Pessoa Comum" tentar acessar qualquer página na pasta "Admin" será bloqueada.

    Deu pra entender? Ficou grande o texto mas espero ter ajudado. abraços

    Fonte:http://msdn.microsoft.com/en-us/library/yh26yfzy.aspx

    http://msdn.microsoft.com/en-us/library/ff648345.aspx

     


    Rodrigo Reis Ferreira
    Microsoft Certified
    Thursday, November 17, 2011 11:56 AM
  • o MemberShip é um ótimo controlador de logins, já tinha feito alguns testes com ele antes, já que vem como padrão no template site.Master do Visual Studio, mais ele guarda seus dados de usuários no SQLExpress ou em algum outro lugar que não cheguei a identificar, e não sei se seria útil para nosso projeto a utilização dele já que este projeto é uma migração que um software já existente em PHP que já há toda uma estrutura de Banco a ser seguida e mantida, sendo que entre ela há toda uma manutenção de usuário e permissões de acesso as telas no Banco, sendo que minha manutenção de usuário e permissões teria que continuar no banco de dados.

    Estou analisando as dicas do francisco a cima, e buscando uma solução para meu controle de acesso, já praticamente desisti da ideia inicial de paginas ascx, e não tenho nada certo, só estudando alguma solução que seja adequada a nosso problema.

    Obrigado pelas dicas.

    e se tiverem alguma outra possível solução em mente fico grato.

    Obs: assim que eu resolver isso aqui posto a solução.

    Att. Fernando 


    Fernando
    Thursday, November 17, 2011 6:03 PM
  • Entendo, considerando as limitações então seria melhor pelo web.config mesmo.

    De uma olhada em HttpModule e handlers. Talvez validar o destino no evento Application_Start do global.asax e redirecionar o usuário se preciso. :)


    Rodrigo Reis Ferreira
    Microsoft Certified
    Thursday, November 17, 2011 7:15 PM
  • Olha gente, suas resposta me ajudaram muito, acabei conseguindo fazer um controle acesso de usuário, a partir do link do o Francisco me passou, http://www.macoratti.net/aspn_fbs1.htm, muito bom este link, me esclareceu muitas duvidas, mas no final este solução acabou não satisfazendo as nossas necessidades e acabamos, não adotando ela, já q todo nosso controle de usuário tem q ser muito dinâmico e quem escolhe quem pode acessar o que e a qual grupo cada usuário pertence, assim como a hierarquia de grupos (parent) é o administrador de TI da empresa, e todas essas informação já existem no banco e podem ser modificadas a qualquer momento, assim se for feito todo controle de acesso via web.config, uso ficará sem este controle dinâmico (a não ser que acha alguma forma de deixa o arquivo web.config dinamico, se há gostaria de saber),  então só estou mando um "response" aos "requests" que vocês me enviaram e me ajudaram muito, agora vou começa a tentar fazer todo esse controle de permissões no braço através de verifica de grupos de usuário, e percorrendo seus Parents.

    Valeu pela ajuda, fico Grato

    A sim e gostaria que me fosse indicado, algum artigo, um explicação de como usar delegates para poder acessar os eventos das paginas acsx, atrazes das paginas .aspx, que foi minha duvida inicial (Obs: fiquem tranquilos, que não vou usar meu controle com paginas .ascx, vou tentar fazer tudo em .aspx como me indicaram), gostaria de saber por curiosidade, e se por ventura futuramente eu precisar de algo assim dai eu já sei fazer. 

    valeu de novo, e aguardo resposta.


    Fernando
    Monday, November 21, 2011 10:24 AM
  • Fala Fernando..

    Seguinte... 

    1 - Para você acessar um evento(ou método) do user control através da pagina,  basta você chamar o evento(método) diretamente.

        Ex: UserControl1.CadastrarCliente.

        O User Control, é um controle como qualquer outro. Por ele você tem acesso a todos seus métodos e propriedades.

        O ideal é que você não chame um evento.. e sim um método do user control. Desta forma a sua organização de métodos (responsabilidade             do mesmos) estará muito melhor estruturada.

        Provavelmente você não esta conseguindo acessar o método de dentro do user control porque ele esta como protected. Basta você alterar para public, que você conseguirá acessá-lo

    2 - Para fazer o inverso, que é chamar um método da página atraves do UserControl, você precisará de delegates. 

        a - No UserControl crie um evento associado a um delegate.

        b - Dentro de algum evento que você queira usar.. crie uma chamada para este evento

        c - Na página aspx, Associe o evento do UserControl a um método a página.

        d - Fazendo isso.... Toda a vez que você chamar o evento de dentro do usercontrol, a página irá capturar esta ação e chamar o método dela que esta associado.

    Segue abaixo um exemplo.

    No UserControl.

    public delegate void Teste();
    public event Teste evento;
    public void Button1_Click(object sender, EventArgs e)
    {
        this.evento();
    }
    
    

    Na Página:

    protected void Page_Load(object sender, EventArgs e)
    {
        WebUserControl11.evento += new WebUserControl1.Teste(WebUserControl11_evento);
    }
    void WebUserControl11_evento()
    {
    }
    
    

    OK?

    Espero ter ajudado.

    PS: Não esqueça de marcar como respondido as respostas que valeram para você.

     


    Francisco Gonçalves
    Blog: franciscogoncalves.wordpress.com

    Monday, November 21, 2011 11:40 AM