2012-12-07 36 views
15

Làm cách nào để đạt được chức năng dưới đây?Cách trả lại 404 với chế độ xem asp.net mvc

khiển My:

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

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

Trả lại chế độ xem với 404 không có ý nghĩa. 404 là mã trạng thái cho trang không tìm thấy. Để trả lại một trang chỉ đơn giản là lạ. Mong đợi sự không nhất quán của trình duyệt nếu bạn làm điều này. – Liam

Trả lời

18

Chỉ cần viết

Response.StatusCode = 404; 

trước khi trở về xem.

+4

Đây chính xác là những gì 'return HttpNotFound();' không nằm trong phần cover. Nó thêm một mã trạng thái 404 và StatusDescription vào đáp ứng HttpContext hiện tại. – levelnis

+0

@levelnis Sự khác biệt là lệnh này không kết thúc hàm như 'return'. Nhân tiện: câu trả lời của Alan Low giống y như tôi, và có thể có lý do để nó được thăng hạng ... – fero

+1

Cảm ơn câu trả lời! Để thực sự phù hợp với nhu cầu của tôi, tôi phải thêm thông tin sau vào cấu hình web của mình: user1615362

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

return View(); 
+0

Như với ở trên, bạn sẽ lưu ý rằng Chế độ xem không được trả lại tại đây. –

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

Câu hỏi không phải là cách trả về 404, nhưng cách trả về cùng một trang với tiêu đề 404 http. – user1615362

+2

Nếu bạn nghĩ về nó, mọi yêu cầu đến một máy chủ web chỉ đơn giản là trả về một phản ứng với một mã trạng thái. Nếu mã trạng thái là 200 thường có một số html với nó mà chúng tôi nghĩ là một trang, nhưng nó chỉ là một mã trạng thái như xa như máy chủ là có liên quan, cho dù đó là 200, 404, vv – levelnis

+0

FYI 'new EmptyResult()' giống như '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

Vì vậy, tại sao «return' đầu tiên, vì thứ hai sẽ trở lại. –

+0

Trong ví dụ này, tôi đồng ý, chỉ cần trả lại lần cuối. Tuy nhiên tôi đã thực hiện một giả định rằng có thể có một số mã bổ sung sau khi kiểm tra null mà sẽ chỉ có liên quan nếu 'một cái gì đó' không phải là null. –

+0

Như tôi đã [nêu trên câu hỏi] (https://stackoverflow.com/questions/13764685/how-to-return-404-with-asp-net-mvc-view#comment80368073_13764685) trả lại chế độ xem và 404 là hành vi kỳ quái. Tôi sẽ không khuyên bạn nên làm điều này (ngay cả khi OP yêu cầu) – Liam

0

Tôi sẽ ném ngoại lệ 404 và tạo bộ lọc ngoại lệ tùy chỉnh trả về trang không tìm thấy lỗi 404. Bộ lọc tích hợp HandleError không xử lý lỗi 404.

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

return View(); 
2

Bạn nên đặt TrySkipIisCustomErrors tài sản của Response như true.

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

Câu trả lời hay nhất cho kịch bản của tôi vì nó cho phép bạn trả về một khung nhìn tùy ý thay vì máy chủ tiếp quản và hiển thị phản hồi 404 mặc định – rdans

Các vấn đề liên quan