2012-12-07 14 views
15

Come si ottiene la funzionalità seguente?Come restituire 404 con asp.net vista mvc

mio controler:

if (something == null) 
{   
    //return the view with 404 http header 
    return View();   
} 

    //return the view with 200 http header 
    return View(); 
+0

Restituire la vista con un 404 non ha senso. 404 è il codice di stato per la pagina non trovata. Anche restituire una pagina è semplicemente strano. Aspettarsi delle incoerenze del browser se si esegue questa operazione. – Liam

risposta

18

Basta scrivere

Response.StatusCode = 404; 

prima di tornare la vista.

+4

Questo è esattamente ciò che 'restituisce HttpNotFound();' fa sotto le copertine. Aggiunge un 404 StatusCode e StatusDescription all'attuale risposta HttpContext. – levelnis

+0

@levelnis La differenza è che questo comando non termina la funzione come 'return'. A proposito: la risposta di Alan Low è esattamente la mia, e potrebbe esserci un motivo per cui è stato svalutato ... – fero

+1

Grazie per la risposta! Per questo per soddisfare le mie esigenze, ho dovuto aggiungere quanto segue alla mia configurazione web: user1615362

0
if (something == null) 
{   
    return HttpNotFound(); 
} 

return View(); 
+0

Come per quanto sopra, si noterà che la vista non viene restituita qui. –

9
if (something == null) 
{   
    return new HttpNotFoundResult(); // 404 
} 
else 
{ 
    return new HttpStatusCodeResult(HttpStatusCode.OK); // 200 
} 
+1

La domanda non è come restituire 404, ma come restituire la stessa pagina con l'intestazione http 404. – user1615362

+2

Se ci pensate, ogni richiesta a un server web restituisce semplicemente una risposta con un codice di stato. Se il codice di stato è 200, di solito c'è qualche html che pensiamo come una pagina, ma è solo un codice di stato per quanto riguarda il server, sia 200, 404, ecc. – levelnis

+0

FYI 'new EmptyResult()' è uguale a 'new HttpStatusCodeResult (HttpStatusCode.OK)' –

7
if (something == null) 
{   
    Response.StatusCode = (int)HttpStatusCode.NotFound; 
    return View();   
} 

//return the view with 200 http header 
return View(); 
+1

Quindi, perché il primo 'return', poiché anche il secondo ritornerà. –

+0

In questo esempio così com'è, sono d'accordo, solo l'ultimo ritorno sarebbe stato necessario. Tuttavia ho ipotizzato che potrebbe esserci stato qualche codice aggiuntivo dopo il controllo nullo che sarebbe rilevante solo se "qualcosa" non fosse nullo. –

+0

Come ho [dichiarato sulla domanda] (https://stackoverflow.com/questions/13764685/how-to-return-404-with-asp-net-mvc-view#comment80368073_13764685) restituendo una vista e un 404 è un comportamento bizzarro. Non consiglierei di farlo (anche se l'OP lo ha richiesto) – Liam

0

Vorrei lanciare un'eccezione 404 e creare un filtro eccezioni personalizzato che restituisca una pagina non trovata per errori 404. Il filtro integrato HandleError non gestisce gli errori 404.

if (something == null) 
{   
    throw new HttpException(404, "Not found") 
} 

return View(); 
2

È necessario impostare la proprietà di TrySkipIisCustomErrorsResponse come true.

public ActionResult NotFound() 
{ 
    Response.StatusCode = 404; 
    Response.TrySkipIisCustomErrors = true; 
    return View(); 
} 
+0

La migliore risposta per il mio scenario in quanto consente di restituire una vista arbitraria invece del server che subentra e visualizza la risposta 404 predefinita – rdans

Problemi correlati