none
Redirecionamento de página em outra camada - VB RRS feed

  • Pergunta

  • Pessoal,

    Estou com uma dúvida no VB. Estou tentando redirecionar uma página depois do processo de cadastro de usuario do Membership do ASP.NET, porém tive dificuldades de colocar os comandos mais conhecidos(response.write) por ser outra 'camada' de projetos.


    A ultima tentativa foi com o comando 

    Me.Context.Response.Redirect("~/Pages/DadosComplementares.aspx")

    Porém está gerando excessão e apresentando um erro de thread.

    Alguém pode me ajudar?

    quarta-feira, 3 de outubro de 2012 17:56

Respostas

  • Boa noite Daniel,

    Quando se escolhe um padrão devemos ser rigorosos e seguir o padrão.

    Parece-me que estás a usar MVC e nesse caso a decisão de "navegação" cabe ao Controller e é nele que deve ser realizada. Assim, no teu caso, a camada de negócio deve devolver algo para o Controller que permita tomar decisões e é aqui que deves usar uma das seguintes opções:

    public ActionResult MyAction() {     
      // Use this for an action     
      return RedirectToAction("ActionName");     
      // Use this for a URL     
      return Redirect("http://google.pt"); 
    } 
    Quando digo devolver não tem que ser directamente ... pode ser indirectamente através da análise da Identity ou de um Item do HttpContext.

    Nuno Gomes http://nunogomes.net

    • Marcado como Resposta Harley Araujo sexta-feira, 5 de outubro de 2012 12:22
    • Não Marcado como Resposta Daniel G Mota segunda-feira, 8 de outubro de 2012 18:56
    • Marcado como Resposta Daniel G Mota sexta-feira, 14 de junho de 2013 19:21
    quinta-feira, 4 de outubro de 2012 23:12

Todas as Respostas

  • Tenta o Server.Transfer("Sua página")

    André Baltieri
    MTAC – Microsoft Technical Audience Contributor

    Twitter: @andrebaltieri
    Blog: http://andrebaltieri.net

    quarta-feira, 3 de outubro de 2012 18:33
  • Existe um parâmetro adicional para evitar que alguma thread seja interrompida durante a transferência.

    Faça um teste, segue um print para ajudar a entender:

    Seria por exemplo:

    Me.Context.Response.Redirect("x.aspx",true)

    Boa sorte.


    É possível sim! Ponha isso na sua cabeça. É possível. "Steve Jobs"

    Eduardo Pires
    www.eduardopires.net.br

           

    quarta-feira, 3 de outubro de 2012 18:51
  • ja tentei.. veja nas linhas comentadas do primeiro print.
    quarta-feira, 3 de outubro de 2012 19:12
  • Interessante, mas infelizmente deu o mesmo erro.

    Component: aspnet_Membership_ModalDataView3
    Controller: aspnet_Membership; View: signUpForm; Timed out: false
    Exception: System.Threading.ThreadAbortException
    Message: O thread estava sendo anulado.
    Stack:
       em System.RuntimeMethodHandle._InvokeMethodFast(Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner)
       em System.RuntimeMethodHandle.InvokeMethodFast(Object target, Object[] arguments, Signature sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner)
       em System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
       em System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
       em System.Web.Script.Services.WebServiceMethodData.CallMethod(Object target, IDictionary`2 parameters)
       em System.Web.Script.Services.WebServiceMethodData.CallMethodFromRawParams(Object target, IDictionary`2 parameters)
       em System.Web.Script.Services.RestHandler.InvokeMethod(HttpContext context, WebServiceMethodData methodData, IDictionary`2 rawParams)
       em System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)

    quarta-feira, 3 de outubro de 2012 19:21
  • E ae tuco, blz cara?

    Eu consegui desta forma:

    Na class library adicionei referencia ao System.Web e redirecioneu assim:

    System.Web.HttpContext.Current.Response.Redirect("About.aspx");

    Mas sem dúvida, seria mais interessante você executar esse procedimento na camada de apresentação.

    Fonte: http://p2p.wrox.com/book-professional-asp-net-2-0-special-edition-isbn-978-0-7645-7610-2-isbn-978-0-470-04178-9/42364-response-redirect-c-class.html


    Se a resposta foi útil por favor qualifique! Janderson Candido de Mattos - MCPD

    quinta-feira, 4 de outubro de 2012 12:42
  • Mesmo com System.Web na frente persistiu o erro.

    Acho que o problema é porque quero redirecionar essa pagina no meio da execução de outra camada..

    Mesmo assim parece ser o unico jeito de fazer é dentro desta rotina, até porque me indicaram isso.


    Att. Daniel Guimarães Analista de Sistemas

    quinta-feira, 4 de outubro de 2012 19:25
  • Boa noite Daniel,

    Quando se escolhe um padrão devemos ser rigorosos e seguir o padrão.

    Parece-me que estás a usar MVC e nesse caso a decisão de "navegação" cabe ao Controller e é nele que deve ser realizada. Assim, no teu caso, a camada de negócio deve devolver algo para o Controller que permita tomar decisões e é aqui que deves usar uma das seguintes opções:

    public ActionResult MyAction() {     
      // Use this for an action     
      return RedirectToAction("ActionName");     
      // Use this for a URL     
      return Redirect("http://google.pt"); 
    } 
    Quando digo devolver não tem que ser directamente ... pode ser indirectamente através da análise da Identity ou de um Item do HttpContext.

    Nuno Gomes http://nunogomes.net

    • Marcado como Resposta Harley Araujo sexta-feira, 5 de outubro de 2012 12:22
    • Não Marcado como Resposta Daniel G Mota segunda-feira, 8 de outubro de 2012 18:56
    • Marcado como Resposta Daniel G Mota sexta-feira, 14 de junho de 2013 19:21
    quinta-feira, 4 de outubro de 2012 23:12
  • Tuco, ja tentou passar o segundo parametro para false:

    Response.Redirect(url, false);

    Veja só:

    A segunda sobrecarga método utiliza dois parâmetros entrada: a URL para o local de destino e um valor booleano que indica se deseja interromper a execução da página atual

    http://stackoverflow.com/questions/2777105/response-redirect-causes-system-threading-threadabortexception


    Se a resposta foi útil por favor qualifique! Janderson Candido de Mattos - MCPD

    sexta-feira, 5 de outubro de 2012 11:27
  • Marcar como false realmente parou de estourar excessão..

    Agora dá outro erro:

    Component: aspnet_Membership_ModalDataView3
    Controller: aspnet_Membership; View: signUpForm; Timed out: false
    Exception: System.InvalidOperationException
    Message: Falha ao autenticar.
    Stack:


    Att. Daniel Guimarães Analista de Sistemas

    sexta-feira, 5 de outubro de 2012 13:00
  • "a camada de negócio deve devolver algo para o Controller que permita tomar decisões"

    Entendi a teoria, mas não entendi o exemplo do código. Está dizendo que teria que criar uma função na camada de navegação e chamá-la na outra camada?


    Att. Daniel Guimarães Analista de Sistemas

    segunda-feira, 8 de outubro de 2012 18:59
  • Não, você pode executar tudo que tem para fazer na sua camada de negócios, e ao final quando retornar para a view você chama outra página.

    Se a resposta foi útil por favor qualifique! Janderson Candido de Mattos - MCPD


    terça-feira, 9 de outubro de 2012 00:36
  • Não, isso invertia toda a lógica. O que você tem que fazer é garantir que o Controller sabe se o SignUp correu bem ou não.

    Na pratica existem duas formas de fazer isso:

    • A mais simples é através do retorno do método de Business
    • A mais complexo é através de avaliação indirecta, i.e., avaliando o contexto de execução para avaliar se houve mudanças

    Com base nesta avaliação então você decide que navegação realizar.

    Este é um mecanismo standard em aplicações n-Tier.


    Nuno Gomes http://nunogomes.net

    terça-feira, 9 de outubro de 2012 00:44
  • Éhhh se ele estiver usando Asp.Net MVC eu concordo, com web forms também da para fazer mas eu acho que não fica muito prático....

    Mas se você pensar no Web forms, o code-behind atua como um controller também, então não estaria errado.


    Se a resposta foi útil por favor qualifique! Janderson Candido de Mattos - MCPD


    terça-feira, 9 de outubro de 2012 00:49
  • Percebi que o problema não é as camadas. Minha empresa trabalha com Ferramenta case/gerador de codigo ASP.NET.. =S

    Peguei um projeto WebSite(sem MVC) e fiz o mesmo procedimento colocando o comando de redirecionar. Mesmo sendo uma camada, o VS também não permite usar 'Response.Redirect' neste .vb

    Conclusão, mesmo sem MVC estoura o erro que postei na sexta-feira, 5 de outubro de 2012 13:00.


    Att. Daniel Guimarães Analista de Sistemas

    quarta-feira, 10 de outubro de 2012 14:50