2012-07-03 29 views
5

here numaralı blogda ve SO üzerinde here numaralı bir iletiyi kullanarak tüm hata sayfalarım işlemesi gereken bir denetleyici oluşturdum.MVC3 Özel hata sayfaları boş sonuç veriyor

benim Global.asax.cs ben aşağıdaki kod parçası var:

protected void Application_Error() 
     { 
      var exception = Server.GetLastError(); 
      var httpException = exception as HttpException; 
      var routeData = new RouteData(); 

      Response.Clear(); 
      Server.ClearError(); 

      routeData.Values["controller"] = "Error"; 
      routeData.Values["action"] = "General"; 
      routeData.Values["exception"] = exception; 
      Response.StatusCode = 500; 

      if (httpException != null) 
      { 
       Response.StatusCode = httpException.GetHttpCode(); 
       switch (Response.StatusCode) 
       { 
        case 403: 
         routeData.Values["action"] = "Http403"; 
         break; 
        case 404: 
         routeData.Values["action"] = "Http404"; 
         break; 
       } 
      } 

      // Avoid IIS7 getting in the middle 
      Response.TrySkipIisCustomErrors = true; 
      IController errorsController = new ErrorController(); 
      HttpContextWrapper wrapper = new HttpContextWrapper(Context); 
      var rc = new RequestContext(wrapper, routeData); 
      errorsController.Execute(rc); 
     } 

Benim ErrorController şöyle görünür:

public class ErrorController : BaseController 
    { 
     /// <summary> 
     /// Returns a default view for not having access. 
     /// </summary> 
     public ActionResult Unauthorized() 
     { 
      BaseModel viewModel = new BaseModel 
             { 
              LoginModel = new LogonModel(), 
              ProfessionsTopX = GetTopXProfessions() 
             }; 
      return View(viewModel); 
     } 

     public ActionResult General(Exception exception) 
     { 
      return View("Exception", exception); 
     } 

     public ActionResult Http404() 
     { 
      //This line works 
      //return Content("Not found", "text/plain"); 

      //This line presents a blank page 
      return View("404","_Layout"); 
     } 

     public ActionResult Http403() 
     { 
      return View("403", "_Layout"); 
     } 

    } 

Ve Razor View sadece parçasını içermektedir html aşağıda;

@{ 
    ViewBag.Title = "404"; 
} 

<h2>404</h2> 

This is a 404 page! 

Ben düz textoutput i 404 sayfa bakıyorum bana alıyorum Dönüş İçeriği kullanma

. Ancak, 404 sayfasının tasarımımın geri kalanına sığmasını istiyorum, bu yüzden kendi Görünümlerimi kullanmak istiyorum. Ancak İade Görünümü'nü kullandığım anda boş bir sayfa alıyorum. Çok açık bir şeyi kaçırmayı umuyorum ama göremiyorum.

+0

Bu aynı şey, benim kodumdan sonra modellemediğim yazılara kadar oluyor. –

+0

Bu aynısı bana oluyor. Bu problem için bir çözüm buldunuz mu? –

cevap

4

Aynı problemi yaşıyordum ve sonunda benim için çalışan çözümü buldum.

istisna yuttu ediliyordu
The view 'Detail' or its master was not found or no view engine supports the 
searched locations. The following locations were searched: 
~/Views/Errors/Detail.aspx 
~/Views/Errors/Detail.ascx 
~/Views/Shared/Detail.aspx 
~/Views/Shared/Detail.ascx 
~/Views/Errors/Detail.cshtml 
~/Views/Errors/Detail.vbhtml 
~/Views/Shared/Detail.cshtml 
~/Views/Shared/Detail.vbhtml 

, bu Application_Error yönteminin içine oluyordu çünkü varsayalım ve: Ben errorsController.Execute(rc); satırda kesme noktası yerleştirilir ve 'içine adım' kullanıldığında bu istisna geldi kadar atılım geldi çünkü Response.TrySkipIisCustomErrors = true'u ayarlamıştım.

Bu hatayı gördükten sonra, sorunumun yalnızca eşleşmeyen adlardan biri olduğunu hemen fark ettim: Denetleyicim, ErrorsController değil, 's' olan ErrorController olarak adlandırıldı. Sorun benim için routeData.Values["controller"] = "Errors"; ayarlamıştı, ki bu yanlış. routeData.Values["controller"] = "Error";'a çevirmek sorunu çözdü.

Hatayı hemen yakalamayacağınızı unutmayın, çünkü doğrudan denetleyiciyi başlatırsınız ve bu parçanın yanlış yazıldığından derleme yapmaz. Ancak denetleyicinin içinde, View() öğesini çağırmak, RequestContext nesnesine oluşturduğumuz ve ilettiğimiz RouteData örneğini kullanarak görünümü arar. Böylece, denetleyici adı yanlış yazılırsa, MVC görünümü nasıl arayacağını bilmez ve IIS özel hataları atlandığından sessizce başarısız olur.

Uzun hikaye kısa: Denetleyicinizi kontrol edin ve adları görüntüleyin. Denetleyici adının doğru olması durumunda benzer bir şey olacağını düşünüyorum, ancak görünümün dosya adı eşleşmiyor.

+0

Hayır, bir çözüm bulamadınız, cevabınız için teşekkürler! Çok mantıklı görünüyor. Bunu en kısa sürede deneyecek ve size geri dönecek! – Rob

+0

Ne kadar aptal! Adı Hatalardan Hataya dönüştürdüm ve sonra her şeyden hata ayıklamayı başardım. Önce fark ettim ki hala beyaz bir sayfa görüyordum, ama her şeyden geçtikten sonra anlayabildiğim bir istisna gördüm.Çözüldü ve her şey çalışıyor. – Rob

0

Lütfen dikkat ediniz this. Mvc'de istisna işlemeyi uygulamak için en iyi yoldur.

Aynı özel durum işlemeyi gerçekleştirdim ancak bazı sorunla karşılaşıyorum ancak yine de this numaralı telefonu kullanabilirsiniz.

+0

Dün gece çalıştı, ancak maalesef sorunu çözmedi (henüz) Diğer öneriler memnuniyetle karşılandı! – Rob

İlgili konular