วิธีรับการกระทำ MVC เพื่อส่งคืน 404


142

ฉันมีการกระทำที่ใช้ในสตริงที่ใช้เพื่อดึงข้อมูลบางอย่าง หากสตริงนี้ไม่มีข้อมูลที่ส่งคืน (อาจเป็นเพราะมันถูกลบไปแล้ว) ฉันต้องการส่งคืน 404 และแสดงหน้าข้อผิดพลาด

ขณะนี้ฉันเพิ่งใช้คืนมุมมองพิเศษที่แสดงข้อความแสดงข้อผิดพลาดที่เป็นมิตรเฉพาะกับการกระทำนี้โดยบอกว่าไม่พบรายการ วิธีนี้ใช้ได้ดี แต่ต้องการส่งคืนรหัสสถานะ 404 เพื่อให้เครื่องมือค้นหาทราบว่าเนื้อหานี้ไม่มีอยู่อีกต่อไปและสามารถลบออกจากผลการค้นหาได้

วิธีที่ดีที่สุดที่จะไปเกี่ยวกับเรื่องนี้คืออะไร?

มันง่ายเหมือนการตั้งค่า Response.StatusCode = 404?


คุณต้องรักษา Response.TrySkipIisCustomErrors = true ไว้ด้วย คำตอบโดย @ganders เป็นประหยัดชีวิต ...
ทันเดอร์

คำตอบ:


111

มีหลายวิธีที่จะทำ

  1. คุณถูกต้องในรหัส aspx ทั่วไปสามารถกำหนดได้ตามวิธีที่คุณกำหนด
  2. throw new HttpException(404, "Some description");

1
สิ่งหนึ่งที่ต้องระวังคือถ้าคุณมีหน้า customError ตั้งค่าให้จัดการ 404 หน้าข้อผิดพลาดนี้จะส่งคืน 200 (พบหน้าไม่พบ ... :-() ฉันมักจะโยนข้อยกเว้นจาก BlogController และมีการดำเนินการ NOTFOUND ตั้งรหัสการตอบสนองที่เหมาะสม.
ไนเจลจอห์น

20
ฉันสิ้นสุดที่ทำ: Response.StatusCode = 404; Response.TrySkipIisCustomErrors = true Return View ("MyCustomView"); มันทำงานได้อย่างสมบูรณ์ในสถานการณ์ของฉัน
พอลไฮล์

@PaulHiles: นี่คือคำตอบสำหรับฉันใน MVC3 หวังว่าฉันจะลงคะแนนมันเป็นคำตอบมากกว่าความคิดเห็น
Valamas

ฉันคิดว่ามันใช้งานไม่ได้ถ้าใช้ IIS ในเว็บไซต์ทดสอบของฉันมันใช้งานได้ดี แต่ในเว็บไซต์จริงหน้าข้อผิดพลาดที่กำหนดเองเริ่มขึ้น
Andy Brown

@AndyBrown มันใช้งานได้กับ IIS เช่นเดียวกับ IIS Express คุณต้องตรวจสอบการกำหนดค่า IIS (คอนโซลผู้ดูแลระบบ) ของคุณ
Dewfy

150

ใน ASP.NET MVC 3 ขึ้นไปคุณสามารถส่งคืนHttpNotFoundResultจากคอนโทรลเลอร์

return new HttpNotFoundResult("optional description");

4
การใช้งาน:return new HttpNotFoundResult("optional description");
Valamas

6
HttpNotFound()หากคุณกำลังกลับมาจากภายในตัวควบคุมนอกจากนี้ยังมีวิธีการที่เรียกว่าสะดวกสบาย ดังนั้นคุณสามารถกลับมาreturn HttpNotFound("optional description")แทน
Luis Perez

1
สิ่งต่าง ๆ นั้นไม่สะดวกในปี 2555 ;-)
Stefan Paul Noack


26

รหัส:

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

Web.config

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

นอกจากนี้ยังมีรหัสสถานะทั้งหมดที่มีอยู่ใน enum นี้: HttpStatusCode
user2173353

12

ฉันเคยใช้สิ่งนี้:

Response.StatusCode = 404;
return null;

ขอบคุณ. วิธีนี้ดูดีกว่าการทิ้งข้อยกเว้นราคาแพงบนเซิร์ฟเวอร์ สงสัยว่า 404 จะถูกบันทึกไว้ใน IIS หรือไม่
fozylet

1
แต่ใน asp.net วิธีนี้ไม่ใช่ทางออกที่ดีใช่ไหม เนื่องจากหน้าเว็บจะแสดงข้อมูลที่ละเอียดอ่อนที่เกี่ยวข้องทั้งหมดของเซิร์ฟเวอร์
lzlstyle

1
ข้อยกเว้นหนึ่งข้อจะใช้เวลาน้อยกว่าหนึ่งมิลลิวินาทีในการจัดการ เมื่อเทียบกับไม่กี่ร้อยมิลลิวินาทีเพียงแค่ทำการเชื่อมต่อ HTTP ขึ้นและกลับก็ไม่มีความหมาย โยน HttpException หรือส่งคืน HttpNotFoundResult ตั้งค่ารหัสสถานะด้วยตนเองและคืนค่า Null เป็นสิ่งที่แย่มาก
George


5

ใน NerdDinner เช่น ลองทำดู

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

ขอบคุณ แต่เบื้องหลังฉากนั้นทำให้ HttpException คล้ายกับข้อเสนอแนะอันดับสองในโพสต์ของ Dewfy ฉันกำลังมองหาการควบคุมอีกเล็กน้อยเพื่อให้ฉันสามารถแสดงหน้าข้อผิดพลาดที่ดีโดยเฉพาะสำหรับการดำเนินการไม่เพียง แต่เปลี่ยนเส้นทางไปยังหน้าคอนโทรลเลอร์ / ทั่วโลก 404 ดูเหมือนว่าการตั้งรหัสสถานะและกลับไปที่มุมมองที่กำหนดเองเป็นวิธีที่จะไปสำหรับสถานการณ์ของฉัน
พอลไฮล์

4

ไม่มีตัวอย่างใด ๆ ที่ใช้ได้สำหรับฉันจนกว่าฉันจะเพิ่มบรรทัดกลางด้านล่าง:

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

2
คุณกำลังบอกฉันอย่างจริงจังว่าเรื่องง่าย ๆreturn HttpNotFound();ไม่ได้ผลสำหรับคุณ ระบบของคุณอายุเท่าไหร่
Gone Coding

1
คุณลองreturn HttpNotFound();ไหม ใช้งานได้ดีกับ MVC 4 ขึ้นไป msdn.microsoft.com/en-us/library/… "คุณสมบัติ TrySkipIisCustomErrors จะใช้งานได้เฉพาะเมื่อแอปพลิเคชันของคุณโฮสต์อยู่ใน IIS 7.0 เมื่อเรียกใช้ในโหมดคลาสสิคใน IIS 7.0 ค่าเริ่มต้นของคุณสมบัติ TrySkipIisCustomErrors จะเป็นจริงเมื่อเรียกใช้ในโหมดรวม ค่าเริ่มต้นของคุณสมบัติ TrySkipIisCustomErrors เป็นเท็จ "
Gone Coding


2

ใน. NET Core 1.1:

return new NotFoundObjectResult(null);

1
หากคุณไม่ได้ส่งคืนวัตถุดังนั้น return NotFound () เหมาะสมกว่า แต่ในกรณีใดกรณีหนึ่งคุณจะไม่ได้รับหน้าข้อผิดพลาดที่เป็นมิตรเว้นแต่คุณจะจัดการกับสิ่งที่ต้องการเช่น StatusCodePagesWithReExecute ดูdevtrends.co.uk/blog/handling-404-not-found-in-asp.net-core
Paul Hiles


-1

โปรดลองรหัสตัวอย่างต่อไปนี้:

public ActionResult Test()

{
  return new HttpStatusCodeResult (404,"Not found");
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.