Saya sedang mengembangkan situs web MVC3 dan saya mencari solusi untuk menangani kesalahan dan Render Tampilan kustom untuk setiap jenis kesalahan. Jadi bayangkan saya memiliki Pengontrol "Kesalahan" di mana tindakan utamanya adalah "Indeks" (halaman kesalahan umum) dan pengontrol ini akan memiliki beberapa tindakan lebih untuk kesalahan yang mungkin muncul kepada pengguna seperti "Handle500" atau "HandleActionNotFound".
Jadi setiap kesalahan yang mungkin terjadi pada situs web dapat ditangani oleh Pengendali "Kesalahan" ini (contoh: "Pengontrol" atau "Tindakan" tidak ditemukan, 500, 404, dbException, dll).
Saya menggunakan file peta situs untuk menentukan jalur situs web (dan bukan rute).
Pertanyaan ini sudah dijawab, ini adalah balasan untuk Gweebz
Metode applicaiton_error terakhir saya adalah sebagai berikut:
protected void Application_Error() {
//while my project is running in debug mode
if (HttpContext.Current.IsDebuggingEnabled && WebConfigurationManager.AppSettings["EnableCustomErrorPage"].Equals("false"))
{
Log.Logger.Error("unhandled exception: ", Server.GetLastError());
}
else
{
try
{
var exception = Server.GetLastError();
Log.Logger.Error("unhandled exception: ", exception);
Response.Clear();
Server.ClearError();
var routeData = new RouteData();
routeData.Values["controller"] = "Errors";
routeData.Values["action"] = "General";
routeData.Values["exception"] = exception;
IController errorsController = new ErrorsController();
var rc = new RequestContext(new HttpContextWrapper(Context), routeData);
errorsController.Execute(rc);
}
catch (Exception e)
{
//if Error controller failed for same reason, we will display static HTML error page
Log.Logger.Fatal("failed to display error page, fallback to HTML error: ", e);
Response.TransmitFile("~/error.html");
}
}
}
sumber
Jawaban:
Berikut adalah contoh cara saya menangani kesalahan khusus. Saya mendefinisikan
ErrorsController
tindakan dengan penanganan berbagai kesalahan HTTP:dan kemudian saya berlangganan untuk
Application_Error
masukGlobal.asax
dan memanggil controller ini:sumber
Execute
adalah metode yang didefinisikan dalamIController
antarmuka. Ini tidak mungkin dilindungi. Lihatlah kode saya lebih hati-hati:IController errorsController = new ErrorsController();
dan perhatikan jeniserrorsController
variabel yang saya gunakanExecute
metode ini. Itu tipeIController
sehingga tidak ada yang mencegah Anda memanggil metode ini. Dan omong-omongExecute
dilindungi di kelas Controller juga di MVC 3, jadi tidak ada perubahan dalam hal ini.Response.ContentType = "text/html";
Berikut ini lebih banyak artikel Cara membuat halaman kesalahan khusus dengan MVC http://kitsula.com/Article/MVC-Custom-Error-Pages .
sumber
Anda juga dapat melakukan ini di File Web.Config. Berikut adalah contoh yang berfungsi di IIS 7.5.
sumber
Saya melihat Anda menambahkan nilai konfigurasi untuk
EnableCustomErrorPage
dan Anda juga memeriksaIsDebuggingEnabled
untuk menentukan apakah akan menjalankan penanganan kesalahan atau tidak.Karena sudah ada
<customErrors/>
konfigurasi di ASP.NET (yang dimaksudkan persis untuk tujuan ini), paling mudah mengatakan:Kemudian di konfigurasi Anda akan meletakkan
<customErrors mode="RemoteOnly" />
mana yang aman untuk digunakan seperti itu, dan ketika Anda perlu menguji halaman kesalahan khusus Anda Anda akan mengaturnya<customErrors mode="On" />
sehingga Anda dapat memverifikasi bahwa itu berfungsi.Catatan Anda juga perlu memeriksa apakah
HttpContext.Current
null karena pengecualian diApplication_Start
masih akan menggunakan metode ini meskipun tidak akan ada konteks aktif.sumber
Anda dapat menampilkan halaman kesalahan ramah-pengguna dengan kode status http yang benar dengan menerapkan modul Penanganan Pengecualian Ramah-Pengguna Jeff Atwood dengan sedikit modifikasi untuk kode status http. Ini berfungsi tanpa pengalihan. Meskipun kodenya dari 2004 (!), Ia berfungsi baik dengan MVC. Ini dapat dikonfigurasi sepenuhnya di web.config Anda, tanpa perubahan kode sumber proyek MVC sama sekali.
Modifikasi yang diperlukan untuk mengembalikan status HTTP asli daripada
200
status dijelaskan dalam posting forum terkait ini .Pada dasarnya, di Handler.vb, Anda dapat menambahkan sesuatu seperti:
sumber
Saya menggunakan MVC 4.5 dan saya mengalami masalah dengan solusi Darin. Catatan: Solusi Darwin sangat bagus dan saya menggunakannya untuk menghasilkan solusi saya. Inilah solusi saya yang dimodifikasi:
sumber