Eu tenho alguns códigos básicos para determinar erros em meu aplicativo MVC. Actualmente no meu projeto eu tenho um controlador chamado Error
com métodos de ação HTTPError404()
, HTTPError500()
e General()
. Todos eles aceitam um parâmetro de string error
. Usando ou modificando o código abaixo. Qual é a melhor / adequada maneira de passar os dados para o controlador de erro para processamento? Gostaria de ter uma solução o mais robusta possível.
protected void Application_Error(object sender, EventArgs e)
{
Exception exception = Server.GetLastError();
Response.Clear();
HttpException httpException = exception as HttpException;
if (httpException != null)
{
RouteData routeData = new RouteData();
routeData.Values.Add("controller", "Error");
switch (httpException.GetHttpCode())
{
case 404:
// page not found
routeData.Values.Add("action", "HttpError404");
break;
case 500:
// server error
routeData.Values.Add("action", "HttpError500");
break;
default:
routeData.Values.Add("action", "General");
break;
}
routeData.Values.Add("error", exception);
// clear error on server
Server.ClearError();
// at this point how to properly pass route data to error controller?
}
}
fonte
Para responder à pergunta inicial "como passar corretamente os dados de roteamento para o controlador de erro?":
Em seguida, em sua classe ErrorController, implemente uma função como esta:
Isso empurra a exceção para a View. A página de visualização deve ser declarada da seguinte forma:
E o código para exibir o erro:
Esta é a função que reúne todas as mensagens de exceção da árvore de exceções:
fonte
Eu encontrei uma solução para o problema de ajax observado por Lion_cl.
global.asax:
ErrorPagesController
AjaxRedirectResult
AjaxRequestExtension
fonte
Eu já lutava com a ideia de centralizar uma rotina global de tratamento de erros em um aplicativo MVC antes. Eu tenho uma postagem nos fóruns ASP.NET .
Basicamente, ele lida com todos os erros do seu aplicativo no global.asax sem a necessidade de um controlador de erro, decorando com o
[HandlerError]
atributo ou mexendo nocustomErrors
nó do web.config.fonte
Talvez a melhor maneira de lidar com erros no MVC seja aplicar o atributo HandleError ao seu controlador ou ação e atualizar o arquivo Shared / Error.aspx para fazer o que você deseja. O objeto Model nessa página inclui uma propriedade Exception, bem como ControllerName e ActionName.
fonte
404
erro então? já que não há um controlador / ação designado para isso?Perhaps a better way of handling errors
parece muito com Todos os erros e não apenas 500.Application_Error tendo problemas com solicitações Ajax. Se o erro for tratado no Action que é chamado pelo Ajax - ele exibirá sua Error View dentro do container resultante.
fonte
Esta pode não ser a melhor maneira para MVC ( https://stackoverflow.com/a/9461386/5869805 )
Abaixo está como você renderiza uma visão em Application_Error e escreve para uma resposta http. Você não precisa usar o redirecionamento. Isso evitará uma segunda solicitação ao servidor, de modo que o link na barra de endereços do navegador permanecerá o mesmo. Isso pode ser bom ou ruim, depende do que você deseja.
Global.asax.cs
Visão
fonte
Brian, Esta abordagem funciona muito bem para solicitações não Ajax, mas como Lion_cl afirmou, se você tiver um erro durante uma chamada de Ajax, sua visão Share / Error.aspx (ou sua visão de página de erro personalizada) será retornada ao chamador Ajax- -o usuário NÃO será redirecionado para a página de erro.
fonte
Use o seguinte código para redirecionar na página de rota. Use exception.Message instide of exception. Coz exceção string de consulta dá erro se estende o comprimento da querystring.
fonte
Tenho problemas com esta abordagem de tratamento de erros: No caso de web.config:
O manipulador de erros está pesquisando a visualização Error.shtml e a etapa do fluxo de controle em Application_Error global.asax somente após a exceção
assim
httpException is always null then customErrors mode = "On" :( É enganoso Então
<customErrors mode="Off"/>
ou<customErrors mode="RemoteOnly"/>
os usuários veem customErrors html, Then customErrors mode = "On" este código também está erradoOutro problema deste código que
Retorne a página com o código 302 em vez do código de erro real (402.403 etc)
fonte