Usuário com melhor resposta
Redirecionamento de página em outra camada - VB

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?
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
Todas as Respostas
-
-
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
-
-
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)
-
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
-
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
-
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
-
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
-
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
-
"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
-
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
- Editado Janderson Candido de Mattos terça-feira, 9 de outubro de 2012 00:48
-
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
-
É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
- Editado Janderson Candido de Mattos terça-feira, 9 de outubro de 2012 00:50
-
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