Intercettare errori dal server e mostrarli in una pagina errore person...

martedì 15 maggio 2012 - 18.17
Tag Elenco Tags  C#  |  .NET 2.0  |  Windows 7  |  Visual Studio 2010  |  SQL Server 2008 R2  |  Chrome  |  Javascript

Vg Profilo | Newbie

Salve a tutti,
Sono nuovo di questo forum ed è un paio di mesi che ho a che fare con asp.net.
Ho cercato in giro per la rete ma proprio non riesco a risolvere il mio problema ed avrei bisogno di qualcuno di un po più esperto di me che mi dia una mano.
In breve avrei bisogno di intercettare gli errori in arrivo dal server e mostrarli in una pagina di errore personalizzata.

La situazione attualmente e' la seguente:

Possiedo un database gia' creato per un applicativo che si interfacciava ad esso attraverso una serie di form e sto cercando di accedere a questi stessi dati da un applicazione web asp.net MVC2;specifico che uso il motore di database sql2008.

Nel fare cio' in caso di errori riguardanti foreign key o restrizioni varie,vengo riportato in una pagina di errore generico in cui in un modo o nell'altro mi viene fatto capire che il db non ha "risposto" con i dati richiesti e quindi l'applicazione non puo continuare.

La mia domanda e' quindi: posso in questi casi reindirizzare l'utente su una pagina che restituisca il messaggio d'errore che mi viene mandato dal server?

Per esempio un messaggio di questo tipo:

Messaggio dal server!
L'istruzione DELETE e' in conflitto con il vincolo REFERENCE "FK_xxx". Il conflitto si e' verificato nella tabella "xxx" del database "xxx".

Fino ad ora sono riuscito ad ottenere il messaggio che mi serve nella pagina di errore generica modificando il metodo delete del controller della mia tabella in questo modo:
catch (System.Data.SqlClient.SqlException)
{
return View();
}


Il problema rimane come personalizzare la View di errore in modo che mi ritorni SOLAMENTE " L'istruzione DELETE e' in conflitto con il vincolo REFERENCE "FK_xxx". Il conflitto si e' verificato nella tabella "xxx" del database "xxx"." o messaggi simili.
Ho letto degli articoli sulla modifica del Web.config ed ho modificato il mio file aggiungendo le seguenti righe di codice:

<system.web>
<customErrors mode="On" defaultRedirect="ErrorPage.aspx">
</customErrors>
</system.web>

Con la View "ErrorPage.aspx" nella cartella Views non riesco ad ottenere i risultati sperati,oltre a non riuscire a richiamare la pagina non so quali comandi utilizzare per richiamare i dati che "specificano" la mia eccezione all'interno del file .aspx (quindi come mostrare il solito messaggio "l'istruzione delete etc etc"),inoltre inserendo questo codice la schermata mostrata all'utente diventa completamente priva di informazioni e restituisce un semplice errore generico (questo so che è dovuto alla stringa " customErrors mode="On" " ma io vorrei che gli errori del server siano leggibili anche dal cliente (senza le varie specifiche però)). Qualcuno saprebbe darmi una mano?

AGGIORNAMENTO------------
Ho fatto dei progressi ed ora la situazione è la seguente:

Ho un controller (1) che in caso di errori esegue il seguente codice:

catch (System.Data.SqlClient.SqlException ex) { return View(ex.Message.ToString()); }


una volta che la mia applicazione va in errore il web.config

<system.web> <customErrors mode="On" defaultRedirect="Errore"> </customErrors> </system.web>


mi dirotta su un secondo controller (2) col seguente codice:

public ActionResult Index(String ex) { return View(ex); }


Al quale e' assegnata una view (che ho creato con tasto destro -> add view) implementata a questa maniera:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra


Come posso fare per passare la stringa del controller (1) (il messaggio di sql) alla view in questione?

Gluck74 Profilo | Guru

ciao,
in pratica la cosa più semplice che potresti fare secondo me è questa:
quando sei all'interno del catch, prendi tutte le informazioni dell'errore e ti ricostruisci il messaggio come vorresti visaulizzarlo.
Puoi usare semplicemente una stringa già pronta, o una piccola struct con tutti i dati spezzezzati come meglio credi.
Poi questo risultato lo puoi ad esempio rilanciare per essere catturato dal web.config (istruzione throw), oppure puoi richiamare tu la nuova view.

ciao
____________
http://glucolo.wordpress.com
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5