Saya memiliki beberapa kode dasar untuk menentukan kesalahan dalam aplikasi MVC saya. Saat ini di proyek saya saya memiliki kontroler yang disebut Error
dengan metode tindakan HTTPError404()
, HTTPError500()
dan General()
. Mereka semua menerima parameter string error
. Menggunakan atau memodifikasi kode di bawah ini. Apa cara terbaik / tepat untuk meneruskan data ke Pengontrol kesalahan untuk diproses? Saya ingin mendapatkan solusi yang sekuat mungkin.
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?
}
}
sumber
Untuk menjawab pertanyaan awal "bagaimana cara mengirimkan routedata dengan benar ke pengontrol kesalahan?":
Kemudian di kelas ErrorController Anda, terapkan fungsi seperti ini:
Ini mendorong pengecualian ke View. Halaman tampilan harus dinyatakan sebagai berikut:
Dan kode untuk menampilkan kesalahan:
Berikut adalah fungsi yang mengumpulkan semua pesan pengecualian dari pohon pengecualian:
sumber
Saya menemukan solusi untuk masalah ajax yang dicatat oleh Lion_cl.
global.asax:
ErrorPagesController
AjaxRedirectResult
AjaxRequestExtension
sumber
Saya berjuang dengan gagasan untuk memusatkan rutinitas penanganan kesalahan global di aplikasi MVC sebelumnya. Saya memiliki posting di forum ASP.NET .
Ini pada dasarnya menangani semua kesalahan aplikasi Anda di global.asax tanpa memerlukan pengontrol kesalahan, mendekorasi dengan
[HandlerError]
atribut, atau mengutak-atikcustomErrors
node di web.config.sumber
Mungkin cara yang lebih baik untuk menangani kesalahan di MVC adalah dengan menerapkan atribut HandleError ke controller atau tindakan Anda dan memperbarui file Shared / Error.aspx untuk melakukan apa yang Anda inginkan. Objek Model di halaman itu menyertakan properti Exception serta ControllerName dan ActionName.
sumber
404
kesalahan? karena tidak ada pengontrol / tindakan yang ditujukan untuk itu?Perhaps a better way of handling errors
terdengar seperti Semua Kesalahan dan bukan hanya 500.Application_Error mengalami masalah dengan permintaan Ajax. Jika kesalahan ditangani dalam Tindakan yang disebut oleh Ajax - itu akan menampilkan Tampilan Kesalahan Anda di dalam wadah yang dihasilkan.
sumber
Ini mungkin bukan cara terbaik untuk MVC ( https://stackoverflow.com/a/9461386/5869805 )
Di bawah ini adalah cara Anda merender tampilan di Application_Error dan menuliskannya ke respons http. Anda tidak perlu menggunakan pengalihan. Ini akan mencegah permintaan kedua ke server, jadi tautan di bilah alamat browser akan tetap sama. Ini mungkin baik atau buruk, itu tergantung pada apa yang Anda inginkan.
Global.asax.cs
Melihat
sumber
Brian, Pendekatan ini bekerja sangat baik untuk permintaan non-Ajax, tetapi seperti yang dinyatakan Lion_cl, jika Anda mengalami kesalahan selama panggilan Ajax, tampilan Share / Error.aspx Anda (atau tampilan halaman kesalahan kustom Anda) akan dikembalikan ke pemanggil Ajax- -pengguna TIDAK akan diarahkan ke halaman kesalahan.
sumber
Gunakan kode Mengikuti untuk mengarahkan pada halaman rute. Gunakan pengecualian. Pesan dalam pengecualian. String kueri pengecualian Coz memberikan kesalahan jika memperpanjang panjang string kueri.
sumber
Saya punya masalah dengan pendekatan penanganan kesalahan ini: Dalam kasus web.config:
Penangan kesalahan sedang mencari tampilan Error.shtml dan aliran kontrol masuk ke Application_Error global.asax hanya setelah pengecualian
Begitu
httpException selalu null lalu customErrors mode = "On" :( Menyesatkan Then
<customErrors mode="Off"/>
atau<customErrors mode="RemoteOnly"/>
pengguna melihat customErrors html, Lalu customErrors mode = "On" kode ini juga salahMasalah lain dari kode ini yaitu
Kembalikan halaman dengan kode 302 sebagai gantinya kode kesalahan nyata (402.403 dll)
sumber