2010-07-01 31 views
6

NotFoundResult ve ForbiddenResult gibi belirli HTTP Hatalarını döndürmek için özel bir ActionResult var, hepsi ViewResult'dan türetiliyor.ASP.NET MVC denetleyicisinde HTTP Durumunu ayarlama MVC denetleyicisi sonuçları görüntülenmiyor

Bir eylem sırasında veritabanında bir varlık bulunamazsa, 404 ile kısa devir eylemleri gibi durumlar için bunları kullanırım.

Bu sonuç nesneleri içinde, HTTP Durumunu uygun sayıya ayarladım. Bunu yaptığımda, bu ViewResults referansının görüntülemediği görünüm. Görüşümün oluşturulması için durumu 200 Tamam olarak terk etmem gerekiyor.

ASP.NET MVC 2.0'da nasıl uygun bir durum ayarlayabilirim?

+0

"Görünüm oluşturulmuyor" veya "Tarayıcım görüntülenmiyor mu?" Çünkü bunlar aynı şeyler değil. –

+0

Uygulamadan yanıt 0 bayttır. Yanıtın görünümü yok. –

cevap

8

Ben NotFoundResult ve ForbiddenResult, hepsi ViewResult kaynaklanıyor gibi belirli HTTP Hataları döndürmek için özel bir ActionResult var.

protected void Application_Error(object sender, EventArgs e) 
{ 
    var exception = Server.GetLastError(); 
    // TODO: Log the exception with your favorite logging framework 

    Response.Clear(); 
    var httpException = exception as HttpException; 

    var routeData = new RouteData(); 
    // Take the ErrorController 
    routeData.Values.Add("controller", "error"); 

    if (httpException == null) 
    { 
     // Use the General action for any unhandled error 
     routeData.Values.Add("action", "general"); 
    } 
    else 
    { 
     switch (httpException.GetHttpCode()) 
     { 
      case 404: 
       routeData.Values.Add("action", "httpError404"); 
       break; 
      case 500: 
       routeData.Values.Add("action", "httpError500"); 
       break; 
      default: 
       routeData.Values.Add("action", "general"); 
       break; 
     } 
    } 

    // Add the exception to route data so that the error controller 
    // could use it with RouteData.Values["error"] 
    routeData.Values.Add("error", exception); 

    Server.ClearError(); 
    IController errorController = new ErrorController(); 
    errorController.Execute(new RequestContext(new HttpContextWrapper(Context), routeData)); 
} 
: Global.asax olarak

public class ErrorController : Controller 
{ 
    public ActionResult General() 
    { 
     return View(); 
    } 

    public ActionResult HttpError404() 
    { 
     return View(); 
    } 

    public ActionResult HttpError500() 
    { 
     return View(); 
    } 
} 

Application_Error yöntemi tanımlar: bir hata denetleyici oluşturarak

Başlangıç ​​ve karşılık gelen incelemeler:

Size alternatif bir hata işleme önermek Veren

Nihayet uygun istisnalar atın:

public class HomeController: Controller 
{ 
    public ActionResult Index(int id) 
    { 
     var model = _repository.GetModel(id); 
     if (model == null) 
     { 
      throw new HttpException(404, "Model not found with id = " + id); 
     } 
     return View(model); 
    } 
} 
+0

Hata işleme kodunu birleştirmenin güzel bir yolu gibi görünüyor. Hemen size geri döneceğim teşekkürler! –

+0

Yanıtların neden boş olduğu konusunda hala emin değilim, ancak bu, bazı hata kodlarını bir araya getirirken sorunumu çözdü. Bir uygulama sağladığınız için teşekkürler! Ekleyeceğim tek şey, bunu yaparken özel hataların kapatılması gerektiğidir. –

+0

@BC, herhangi bir kaynak kodu sağlamadığınız için söylemek zor. –