none
MDI/Parent (WindowsForms) x Correspondência no ASP.NET RRS feed

  • Pergunta

  • Olá Pessoal,

    Sou novato em ASP NET e ainda estou realizando alguns estudos para migração de um pequeno sistema que já possuo em WindowsForms.

    A minha dúvida é em relação aos MDI ou forms parents que temos no WindowsForms. Hoje tenho um sistema que possui abas e dentro de cada aba, mostro um Form diferente, mas estático. Ou seja, se trocarmos de aba, não perderemos o que foi digitado ou as alterações feitas lá, podendo voltar nessa aba assim que for necessário. Para isso, eu uso o Form.Parent, carregando todos os Forms e mudando o componente parent de acordo com a aba que foi clicada. Uso um Panel para isso.

    A minha dúvida é como fazer isso em ASP NET. Pesquisei por algumas soluções como usar MasterPage dentro da MasterPage que já tenho, mas acredito que nesse caso, todas vez que trocasse de 'aba', recarregaria o formulário. Também estudei um pouco de Iframe, mas acho que não é o ideal para o que preciso, pois rodaria uma nova página dentro da minha.

    É importante poder recuperar os dados digitados nestas abas através da pagina principal (que seria o MainForm em WindowsForms) e assim conseguir compilar as informações digitadas nas páginas dentro das abas.

    Quem puder me dar uma sugestão de qual componente estudar, ou uma sugestão de código para que eu possa ir atrás de mais informações, será de enorme ajuda.

    Agradeço desde já a contribuição de todos e peço desculpas caso algum termo técnico esteja incorreto.

    segunda-feira, 18 de junho de 2018 00:24

Respostas

  • Então Olive, ASP e WindowsForms tem uma série de similaridades que permitem sim uma migração, mas você tem que entender as diferenças de paradigma.

    Primeiro ponto é que o WindowsForms tem tudo na memória do cliente, todos os componentes e variáveis, e tem só os forms que aquele usuário abriu (por assim dizer), enquanto o ASP você tem que pensar em cliente e servidor, considerar que o servidor tem sessões para cada cliente e dentro dessa sessão um contexto (com a requisição e a resposta) e o servidor processa essa requisição, envia a resposta e "desconecta" daquele cliente. O cliente por usa vez não sabe nada da estrutura do programa, e recebe apenas um HTML.

    O ASP trabalha com um recurso chamado ViewState, onde todo o conteúdo em controles de uma página são serializados em texto e enviados no HTML de resposta em um campo tipo HiddenField "criptografado". Quando a página retorna para o servidor ele "descripta" esse conteúdo e recarrega os controles (no Windows Forms isso não acontece porque tudo está no cliente, e tudo está na memória, não precisa carregar e descarregar dados a cada click de botão).

    Assim sendo, mesmo que um componente não esteja visível na página no cliente, se ele existe na página (no servidor) ele foi serializado, e você não perderá o valor dele. A ideia é que você não precisa nem de múltiplos Forms na página, apenas um MultiView por exemplo é suficiente.

    Com cada Form MDI você usa um View (e coloca os controles dele) e um MultiView (que é igual ao TabPanel - quase - no Windows Forms) onde cada vez que o cliente trocar de aba você só troca o ActiveIndex.

    Algo assim:

    <asp:MultiView runat="server" ID="controle" ActiveIndex="0">
      <asp:View runat="server" ID="formfilho_1">
        <h1>Form Filho 1</h1><b>Esse form fica ativo no ActiveIndex 0</b>
        <asp:Button runat="server" ID="buttonPara2" Text="Ir para Form 2" />
      </asp:View>
      <asp:View runat="server" ID="formfilho_2">
        <h1>Form Filho 2</h1><b>Esse form fica ativo no ActiveIndex 1</b>
        <asp:Button runat="server" ID="buttonPara3" Text="Ir para Form 3" />
      </asp:View>
      <asp:View runat="server" ID="formfilho_2">
        <h1>Form Filho 3</h1><b>Esse form fica ativo no ActiveIndex 2</b>
        <asp:Button runat="server" ID="buttonPara1" Text="Ir para Form 1" />
      </asp:View>
    </asp:MultView>

    Como markup da página, e no CodeBehind você escreve os eventos dos botões "buttonPara1" para trocar o ActiveIndex para 0, "buttonPara2" para trocar o ActiveIndex para 1 e assim em diante.

    O que vai acontecer é que no ViewState da página ficarão todas as informações de todos os controles mesmo que no cliente esteja aparecendo somente 1 View.

    • Editado SammuelMiranda terça-feira, 19 de junho de 2018 15:30
    • Marcado como Resposta OliveCla sexta-feira, 22 de junho de 2018 14:01
    terça-feira, 19 de junho de 2018 15:19
  • OliveCla,

    Você está saindo de um ambiente WinForms e migrando para a Web. Ocorreu uma migração lá em 2000 e tantos, do pessoal saindo do Vb6 indo para o Vb.net e também cresceu a demanda por programadores Web. A Microsoft ofereceu o Asp.net forms. Na época o conhecimento não era tão disseminado, as comunidades eram pequenas e talvez justificasse essa estratégia.

    Hoje a Microsoft vem concentrando esforços no Asp.net core, reescreveu toda a framework e está entregando um produto realmente bacana. Aproveita a chance e segue o caminho que cedo ou tarde, trabalhando com o Web você vai entrar.

    Tenta começar com o MVC ou o Angular. Há uma sinergia muito boa entre o Visual Studio e essas ferramentas.

    Se for utilizar o Angular pense em cada MDI como um componente. Caso seja o Razor, pense como partial views. Use o bootstrap para criar um layout rico e desenhe a tela com Tabs.

    Tabs - Bootstrap

    ASP .NET - Single Page Application(SPA) - AngularJS com Web API


    #fullstack dev - MCSA, MCTS and actually blogging at www.saindodacaixinha.com.br


    • Editado Bruno Brito terça-feira, 19 de junho de 2018 16:15
    • Marcado como Resposta OliveCla sexta-feira, 22 de junho de 2018 14:01
    terça-feira, 19 de junho de 2018 16:12

Todas as Respostas

  • Então Olive, ASP e WindowsForms tem uma série de similaridades que permitem sim uma migração, mas você tem que entender as diferenças de paradigma.

    Primeiro ponto é que o WindowsForms tem tudo na memória do cliente, todos os componentes e variáveis, e tem só os forms que aquele usuário abriu (por assim dizer), enquanto o ASP você tem que pensar em cliente e servidor, considerar que o servidor tem sessões para cada cliente e dentro dessa sessão um contexto (com a requisição e a resposta) e o servidor processa essa requisição, envia a resposta e "desconecta" daquele cliente. O cliente por usa vez não sabe nada da estrutura do programa, e recebe apenas um HTML.

    O ASP trabalha com um recurso chamado ViewState, onde todo o conteúdo em controles de uma página são serializados em texto e enviados no HTML de resposta em um campo tipo HiddenField "criptografado". Quando a página retorna para o servidor ele "descripta" esse conteúdo e recarrega os controles (no Windows Forms isso não acontece porque tudo está no cliente, e tudo está na memória, não precisa carregar e descarregar dados a cada click de botão).

    Assim sendo, mesmo que um componente não esteja visível na página no cliente, se ele existe na página (no servidor) ele foi serializado, e você não perderá o valor dele. A ideia é que você não precisa nem de múltiplos Forms na página, apenas um MultiView por exemplo é suficiente.

    Com cada Form MDI você usa um View (e coloca os controles dele) e um MultiView (que é igual ao TabPanel - quase - no Windows Forms) onde cada vez que o cliente trocar de aba você só troca o ActiveIndex.

    Algo assim:

    <asp:MultiView runat="server" ID="controle" ActiveIndex="0">
      <asp:View runat="server" ID="formfilho_1">
        <h1>Form Filho 1</h1><b>Esse form fica ativo no ActiveIndex 0</b>
        <asp:Button runat="server" ID="buttonPara2" Text="Ir para Form 2" />
      </asp:View>
      <asp:View runat="server" ID="formfilho_2">
        <h1>Form Filho 2</h1><b>Esse form fica ativo no ActiveIndex 1</b>
        <asp:Button runat="server" ID="buttonPara3" Text="Ir para Form 3" />
      </asp:View>
      <asp:View runat="server" ID="formfilho_2">
        <h1>Form Filho 3</h1><b>Esse form fica ativo no ActiveIndex 2</b>
        <asp:Button runat="server" ID="buttonPara1" Text="Ir para Form 1" />
      </asp:View>
    </asp:MultView>

    Como markup da página, e no CodeBehind você escreve os eventos dos botões "buttonPara1" para trocar o ActiveIndex para 0, "buttonPara2" para trocar o ActiveIndex para 1 e assim em diante.

    O que vai acontecer é que no ViewState da página ficarão todas as informações de todos os controles mesmo que no cliente esteja aparecendo somente 1 View.

    • Editado SammuelMiranda terça-feira, 19 de junho de 2018 15:30
    • Marcado como Resposta OliveCla sexta-feira, 22 de junho de 2018 14:01
    terça-feira, 19 de junho de 2018 15:19
  • OliveCla,

    Você está saindo de um ambiente WinForms e migrando para a Web. Ocorreu uma migração lá em 2000 e tantos, do pessoal saindo do Vb6 indo para o Vb.net e também cresceu a demanda por programadores Web. A Microsoft ofereceu o Asp.net forms. Na época o conhecimento não era tão disseminado, as comunidades eram pequenas e talvez justificasse essa estratégia.

    Hoje a Microsoft vem concentrando esforços no Asp.net core, reescreveu toda a framework e está entregando um produto realmente bacana. Aproveita a chance e segue o caminho que cedo ou tarde, trabalhando com o Web você vai entrar.

    Tenta começar com o MVC ou o Angular. Há uma sinergia muito boa entre o Visual Studio e essas ferramentas.

    Se for utilizar o Angular pense em cada MDI como um componente. Caso seja o Razor, pense como partial views. Use o bootstrap para criar um layout rico e desenhe a tela com Tabs.

    Tabs - Bootstrap

    ASP .NET - Single Page Application(SPA) - AngularJS com Web API


    #fullstack dev - MCSA, MCTS and actually blogging at www.saindodacaixinha.com.br


    • Editado Bruno Brito terça-feira, 19 de junho de 2018 16:15
    • Marcado como Resposta OliveCla sexta-feira, 22 de junho de 2018 14:01
    terça-feira, 19 de junho de 2018 16:12
  • Então Olive, ASP e WindowsForms tem uma série de similaridades que permitem sim uma migração, mas você tem que entender as diferenças de paradigma.

    Primeiro ponto é que o WindowsForms tem tudo na memória do cliente, todos os componentes e variáveis, e tem só os forms que aquele usuário abriu (por assim dizer), enquanto o ASP você tem que pensar em cliente e servidor, considerar que o servidor tem sessões para cada cliente e dentro dessa sessão um contexto (com a requisição e a resposta) e o servidor processa essa requisição, envia a resposta e "desconecta" daquele cliente. O cliente por usa vez não sabe nada da estrutura do programa, e recebe apenas um HTML.

    O ASP trabalha com um recurso chamado ViewState, onde todo o conteúdo em controles de uma página são serializados em texto e enviados no HTML de resposta em um campo tipo HiddenField "criptografado". Quando a página retorna para o servidor ele "descripta" esse conteúdo e recarrega os controles (no Windows Forms isso não acontece porque tudo está no cliente, e tudo está na memória, não precisa carregar e descarregar dados a cada click de botão).

    Assim sendo, mesmo que um componente não esteja visível na página no cliente, se ele existe na página (no servidor) ele foi serializado, e você não perderá o valor dele. A ideia é que você não precisa nem de múltiplos Forms na página, apenas um MultiView por exemplo é suficiente.

    Com cada Form MDI você usa um View (e coloca os controles dele) e um MultiView (que é igual ao TabPanel - quase - no Windows Forms) onde cada vez que o cliente trocar de aba você só troca o ActiveIndex.

    Algo assim:

    <asp:MultiView runat="server" ID="controle" ActiveIndex="0">
      <asp:View runat="server" ID="formfilho_1">
        <h1>Form Filho 1</h1><b>Esse form fica ativo no ActiveIndex 0</b>
        <asp:Button runat="server" ID="buttonPara2" Text="Ir para Form 2" />
      </asp:View>
      <asp:View runat="server" ID="formfilho_2">
        <h1>Form Filho 2</h1><b>Esse form fica ativo no ActiveIndex 1</b>
        <asp:Button runat="server" ID="buttonPara3" Text="Ir para Form 3" />
      </asp:View>
      <asp:View runat="server" ID="formfilho_2">
        <h1>Form Filho 3</h1><b>Esse form fica ativo no ActiveIndex 2</b>
        <asp:Button runat="server" ID="buttonPara1" Text="Ir para Form 1" />
      </asp:View>
    </asp:MultView>

    Como markup da página, e no CodeBehind você escreve os eventos dos botões "buttonPara1" para trocar o ActiveIndex para 0, "buttonPara2" para trocar o ActiveIndex para 1 e assim em diante.

    O que vai acontecer é que no ViewState da página ficarão todas as informações de todos os controles mesmo que no cliente esteja aparecendo somente 1 View.


    Olá Samuel,

    Primeiramente gostaria de agradecer sua resposta teórica e prática, era exatamente o que eu esperava. Fiquei apenas com uma dúvida:

    No seu exemplo, esses componentes que ficam dentro dos 'FORMs' estariam na mesma página, correto? Eu teria algum formato onde eu pudesse exibir uma página dentro da outra?

    Pense no exemplo que cada aba destas tem bastante regras e detalhes e facilitaria muito trabalhar com 'telas' em diferentes páginas. Hoje eu trabalho com vários FORMs e chamo eles dentro do Form principal.

    Aprecio desde já o seu retorno.

    terça-feira, 19 de junho de 2018 19:40
  • OliveCla,

    Você está saindo de um ambiente WinForms e migrando para a Web. Ocorreu uma migração lá em 2000 e tantos, do pessoal saindo do Vb6 indo para o Vb.net e também cresceu a demanda por programadores Web. A Microsoft ofereceu o Asp.net forms. Na época o conhecimento não era tão disseminado, as comunidades eram pequenas e talvez justificasse essa estratégia.

    Hoje a Microsoft vem concentrando esforços no Asp.net core, reescreveu toda a framework e está entregando um produto realmente bacana. Aproveita a chance e segue o caminho que cedo ou tarde, trabalhando com o Web você vai entrar.

    Tenta começar com o MVC ou o Angular. Há uma sinergia muito boa entre o Visual Studio e essas ferramentas.

    Se for utilizar o Angular pense em cada MDI como um componente. Caso seja o Razor, pense como partial views. Use o bootstrap para criar um layout rico e desenhe a tela com Tabs.


    Olá Bruno,

    Agradeço desde já suas informações e sua resposta. No caso que você comentou, a diferença usando o ASP CORE / MVC é basicamente na construção/arquitetura das classes? Você recomenda algum livro de fácil entendimento? Hoje já conseguir aprender um pouco de Bootstrap e ASP.NET sem ser Core/MVC.
    terça-feira, 19 de junho de 2018 19:44
  • Recomendo um, já li e acho muito bom, porém é em inglês.

    Pro ASP.NET Core MVC 2 - Seventh Edition

    Há um outro que falam muito bem: Programming ASP.NET Core

    Espero que te ajude!


    #fullstack dev - MCSA, MCTS and actually blogging at www.saindodacaixinha.com.br

    quarta-feira, 20 de junho de 2018 00:19