Cách nhận hành động MVC để trả về 404


142

Tôi có một hành động lấy một chuỗi được sử dụng để lấy một số dữ liệu. Nếu chuỗi này dẫn đến không có dữ liệu nào được trả về (có thể vì nó đã bị xóa), tôi muốn trả về 404 và hiển thị trang lỗi.

Tôi hiện chỉ sử dụng trả về một chế độ xem đặc biệt hiển thị thông báo lỗi thân thiện cụ thể cho hành động này nói rằng không tìm thấy mục đó. Điều này hoạt động tốt, nhưng lý tưởng là muốn trả về mã trạng thái 404 để các công cụ tìm kiếm biết rằng nội dung này không còn tồn tại và có thể xóa nó khỏi kết quả tìm kiếm.

cách tốt nhất để làm việc này là gì?

Có đơn giản như cài đặt Feedback.StatusCode = 404 không?


bạn cũng phải giữ Phản hồi.TrySkipIisCustomErrors = true; Câu trả lời của @ganders là một sự cứu rỗi ...
Thunder

Câu trả lời:


111

Có nhiều cách để làm điều đó,

  1. Bạn đúng trong mã aspx thông thường, nó có thể được chỉ định theo cách được chỉ định của bạn
  2. throw new HttpException(404, "Some description");

1
Một điều cần chú ý là nếu bạn có trang customError được thiết lập để xử lý 404 thì trang lỗi này sẽ trả về 200 (trang không tìm thấy đã được tìm thấy ... :-(). Tôi có xu hướng ném ngoại lệ từ nói BlogContoder và yêu cầu hành động NotFound đặt mã phản hồi phù hợp.
Nigel Sampson

20
Tôi đã kết thúc việc làm: Feedback.StatusCode = 404; Phản hồi.TrySkipIisCustomErrors = true; trả về Chế độ xem ("MyCustomView"); Điều này hoạt động hoàn hảo trong tình huống của tôi.
Paul Hiles

@PaulHiles: Đây là câu trả lời cho tôi trong MVC3. Ước gì tôi có thể nâng cao nó như một câu trả lời hơn là một bình luận.
Valamas 23/12/14

Điều này không hoạt động, tôi nghĩ, nếu sử dụng IIS. Trên trang thử nghiệm của tôi, nó hoạt động tốt, nhưng trên trang trực tiếp, trang lỗi tùy chỉnh xuất hiện.
Andy Brown

@AndyBrown nó hoạt động cho IIS cũng như cho IIS Express, bạn cần xem lại cấu hình của IIS (Bảng điều khiển dành cho quản trị viên)
Dewfy

150

Trong ASP.NET MVC 3 trở lên, bạn có thể trả về một HTTPNotFoundResult từ bộ điều khiển.

return new HttpNotFoundResult("optional description");

4
cách sử dụng:return new HttpNotFoundResult("optional description");
Valamas

6
Nếu bạn đang trở về từ bên trong bộ điều khiển thì cũng có một phương thức tiện lợi được gọi là HttpNotFound(). Vì vậy, bạn có thể trở lại return HttpNotFound("optional description")thay thế.
Luis Perez

1
Mọi thứ sẽ không thuận tiện trở lại vào năm 2012 ;-)
Stefan Paul Noack

61

Trong MVC 4 trở lên, bạn có thể sử dụng các HttpNotFoundphương thức trợ giúp tích hợp:

if (notWhatIExpected)
{
    return HttpNotFound();
}

hoặc là

if (notWhatIExpected)
{
    return HttpNotFound("I did not find message goes here");
}

26

Mã số:

if (id == null)
{
  throw new HttpException(404, "Your error message");//RedirectTo NoFoundPage
}

Web.config

<customErrors mode="On">
  <error statusCode="404" redirect="/Home/NotFound" />
</customErrors>

Ngoài ra, tất cả các mã trạng thái có sẵn tồn tại trong enum này: HttpStatusCode.
user2173353

12

Tôi đã sử dụng cái này:

Response.StatusCode = 404;
return null;

Cảm ơn bạn. Điều này có vẻ tốt hơn so với ném một ngoại lệ tốn kém trên máy chủ. Tự hỏi nếu 404 sẽ được ghi vào nhật ký IIS ... lý tưởng là nó sẽ được.
fozylet

1
Nhưng, trong asp.net, phương pháp này không phải là một giải pháp tốt, phải không? vì trang web sẽ hiển thị tất cả các thông tin nhạy cảm liên quan của máy chủ.
lzlstyle

1
Một ngoại lệ sẽ mất ít hơn một phần nghìn giây để xử lý. So với vài trăm mili giây chỉ để thực hiện kết nối HTTP trở lại thì thật vô nghĩa. ném httpException hoặc trả lại httpNotFoundResult, tự đặt mã trạng thái và trả về null là rất tệ.
George


5

Trong NerdDinner, vd. Hãy thử

public ActionResult Details(int? id) {
    if (id == null) {
        return new FileNotFoundResult { Message = "No Dinner found due to invalid dinner id" };
    }
    ...
}

Cảm ơn, nhưng đằng sau hậu trường, điều đó đã tạo ra một HTTPException tương tự như gợi ý số hai trong bài đăng của Dewfy. Tôi đang tìm kiếm thêm một chút kiểm soát để tôi có thể hiển thị một trang lỗi đẹp cụ thể cho hành động, không chỉ chuyển hướng đến trang điều khiển / trang 404 toàn cầu. Có vẻ như việc đặt mã trạng thái và quay lại chế độ xem tùy chỉnh là cách phù hợp với tình huống của tôi.
Paul Hiles

4

Không có ví dụ nào ở trên làm việc cho tôi cho đến khi tôi thêm dòng giữa bên dưới:

public ActionResult FourOhFour()
{
    Response.StatusCode = 404;
    Response.TrySkipIisCustomErrors = true; // this line made it work
    return View();
}

2
Bạn có nghiêm túc nói với tôi rằng đơn giản return HttpNotFound();không làm việc cho bạn? Hệ thống của bạn bao nhiêu tuổi
Mã hóa

1
Bạn đã thử return HttpNotFound();chưa Nó hoạt động tốt với MVC 4 trở lên. msdn.microsoft.com/en-us/l Library / '"Thuộc tính TrySkipIisCustomErrors chỉ được sử dụng khi ứng dụng của bạn được lưu trữ trong IIS 7.0. , giá trị mặc định của thuộc tính TrySkipIisCustomErrors là sai. "
Mã hóa

2

Tôi sử dụng:

Response.Status = "404 NotFound";

Điều này làm việc cho tôi :-)


2

Trong .NET Core 1.1:

return new NotFoundObjectResult(null);

1
Nếu bạn không trả về một đối tượng thì trả về NotFound () là phù hợp hơn nhưng trong cả hai trường hợp, bạn sẽ không nhận được trang lỗi thân thiện trừ khi bạn xử lý nó với một cái gì đó như StatusCodePagesWithReExecute. Xem devtrends.co.uk/blog/handling-404-not-found-in-asp.net-core
Paul Hiles


-1

Vui lòng thử mã demo sau:

public ActionResult Test()

{
  return new HttpStatusCodeResult (404,"Not found");
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.