2010-07-01 7 views
6

Ho un ActionResult personalizzato per la restituzione di determinati errori HTTP, come NotFoundResult e ForbiddenResult, derivano tutti da ViewResult.Impostazione dello stato HTTP nei risultati del controller ASP.NET MVC non viene visualizzato

Io li uso per istanze come azioni di cortocircuito con un 404 se un'entità non è stata trovata nel database nel corso di un'azione.

All'interno di questi oggetti risultato, ho impostato lo stato HTTP sul numero appropriato. Quando lo faccio, la vista che questi riferimenti ViewResults non esegue il rendering. Devo lasciare lo stato di 200 OK per poter visualizzare la mia vista.

Come si imposta uno stato appropriato E si esegue il rendering di una vista in ASP.NET MVC 2.0?

+0

Intendi "la vista non viene visualizzata" o "il mio browser non la visualizza?" Perché quelli non sono le stesse cose. –

+0

La risposta dall'app è 0 byte. Nessuna risposta è scritta nella risposta. –

risposta

8

Ho un ActionResult personalizzato per tornare alcuni errori HTTP, come NotFoundResult e ForbiddenResult, tutte derivano da ViewResult.

Mi permetta di consiglio di una gestione alternativa errore:

Inizia con la creazione di un controller di errore e le viste corrispondenti:

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

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

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

Nel Global.asax definire il metodo Application_Error:

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

Apportare infine le eccezioni appropriate:

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

Sembra un modo interessante per consolidare il codice di gestione degli errori. Ti risponderò grazie! –

+0

Ancora incerti sul motivo per cui le risposte erano vuote, ma questo ha risolto il mio problema mentre consolidavo insieme qualche codice di errore. Grazie per aver fornito un'implementazione! Una cosa che vorrei aggiungere è che gli errori personalizzati dovrebbero essere disattivati ​​quando si esegue questa operazione. –

+0

@BC, difficile da dire dato che non hai fornito alcun codice sorgente. –

Problemi correlati