2010-07-01 9 views
6

Ich habe eine benutzerdefinierte ActionResult für die Rückgabe bestimmter HTTP-Fehler, wie NotFoundResult und ForbiddenResult, sie alle stammen aus ViewResult.Einstellen des HTTP-Status in ASP.NET MVC-Controller-Ergebnisse nicht anzeigen

Ich verwende sie für Instanzen wie Kurzschlüsse Aktionen mit einem 404, wenn eine Entität nicht im Laufe einer Aktion in der Datenbank gefunden wurde.

In diesen Ergebnisobjekten setze ich den HTTP-Status auf die entsprechende Zahl. Wenn ich das mache, wird die View, auf die diese ViewResults verweisen, nicht gerendert. Ich muss den Status als 200 OK belassen, damit meine Ansicht gerendert werden kann.

Wie setze ich einen entsprechenden Status und render eine Sicht in ASP.NET MVC 2.0?

+0

Meinst du "die Ansicht wird nicht gerendert" oder "mein Browser zeigt sie nicht an?" Weil das nicht die gleichen Dinge sind. –

+0

Die Antwort von der App ist 0 Bytes. In die Antwort wird keine Ansicht geschrieben. –

Antwort

8

Ich habe eine benutzerdefinierte Action für bestimmte HTTP-Fehler Rückkehr, wie NotFoundResult und ForbiddenResult, sie alle von Viewresult ableiten.

Erlauben Sie mir, Ihnen eine alternative Fehlerbehandlung vorschlagen:

starten durch einen Fehler Controller erstellen und die entsprechenden Ansichten:

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

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

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

In Global.asax die Application_Error Methode definieren:

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)); 
} 

Schließlich passende Ausnahmen werfen:

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

Seemes wie eine coole Möglichkeit, Fehlerbehandlungscode zu konsolidieren. Ich melde mich umgehend bei Ihnen! –

+0

Immer noch unsicher, warum Antworten leer waren, aber das löste mein Problem bei der Konsolidierung einige Fehlercode zusammen. Danke für die Bereitstellung einer Implementierung! Eine Sache, die ich hinzufügen würde, ist, dass benutzerdefinierte Fehler ausgeschaltet werden sollten, wenn Sie dies tun. –

+0

@BC, schwer zu sagen, da Sie keinen Quellcode zur Verfügung gestellt haben. –