MVC eylem 404 dönmek için nasıl


142

Bazı verileri almak için kullanılan bir dize alır bir eylem var. Bu dize hiçbir veri döndürülmesine neden oluyorsa (belki de silindiği için), bir 404 döndürmek ve bir hata sayfası görüntülemek istiyorum.

Şu anda sadece öğenin bulunamadığı söyleyerek bu eyleme özgü kolay bir hata mesajı görüntüleyen özel bir görünüm kullanın. Bu iyi çalışıyor, ancak ideal olarak bir 404 durum kodu döndürmek istiyor, böylece arama motorları bu içeriğin artık mevcut olmadığını ve arama sonuçlarından kaldırabileceğini biliyor.

Bununla ilgili en iyi yol nedir?

Response.StatusCode = 404'ü ayarlamak kadar basit mi?


Ayrıca Response.TrySkipIisCustomErrors = true; @Ganders'ın cevabı hayat kurtarıcıydı ...
Thunder

Yanıtlar:


111

Bunu yapmanın birden fazla yolu var,

  1. Ortak aspx kodunda haklısınız, belirtilen şekilde atanabilir
  2. throw new HttpException(404, "Some description");

1
Dikkat edilmesi gereken bir şey, 404'ü işlemek için ayarlanmış bir customError sayfanız varsa, bu hata sayfasının 200 döndüreceği (bulunamadı sayfası bulundu ... :-(). ve NotFound eyleminin uygun yanıt kodunu ayarlamasını sağlayın
Nigel Sampson

20
Yaptım: Response.StatusCode = 404; Response.TrySkipIisCustomErrors = true; dönüş Görünümü ("MyCustomView"); Bu benim durumumda mükemmel çalışıyor.
Paul Hiles

@PaulHiles: Bu MVC3'te benim için cevap. Ben bir yorum yerine bir cevap olarak upvote isterdim.
Valamas

Sanırım IIS kullanılıyorsa bu işe yaramaz. Test sitemde iyi çalışıyor, ancak canlı sitede özel hata sayfası devreye giriyor.
Andy Brown

@AndyBrown, IIS ve IIS Express için çalışır, IIS yapılandırmanızı gözden geçirmeniz gerekir (Yönetici konsolu)
Dewfy

150

ASP.NET MVC 3 ve üzeri bir HttpNotFoundResult denetleyicisinden dönebilirsiniz .

return new HttpNotFoundResult("optional description");

4
kullanım:return new HttpNotFoundResult("optional description");
Valamas

6
Denetleyicinin içinden dönüyorsanız, adı verilen bir kolaylık yöntemi de vardır HttpNotFound(). Bunun return HttpNotFound("optional description")yerine geri dönebilirsiniz .
Luis Perez

1
İşler 2012'de o kadar da uygun değildi ;-)
Stefan Paul Noack

61

MVC 4 ve üzeri sürümlerde yerleşik HttpNotFoundyardımcı yöntemleri kullanabilirsiniz:

if (notWhatIExpected)
{
    return HttpNotFound();
}

veya

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

26

Kod:

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

Web.config

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

Ayrıca, mevcut tüm durum kodları bu numarada bulunur: HttpStatusCode.
user2173353

12

Bunu kullandım:

Response.StatusCode = 404;
return null;

Teşekkür ederim. Bu, sunucuya maliyetli bir istisna atmaktan çok daha iyi görünüyor. 404 IIS günlüklerine giriş yapıp yapmayacağını merak ediyorum ... ideal olarak olurdu.
fozylet

1
Ancak, asp.net'te bu yöntem iyi bir çözüm değildir, değil mi? çünkü web sayfası sunucunun tüm ilgili hassas bilgilerini görüntüler.
lzlstyle

1
Bir istisna işlemesi milisaniyeden daha az sürecektir. Birkaç yüz milisaniye ile karşılaştırıldığında, bir HTTP bağlantısını yukarı ve geri yapmak anlamsızdır. Durum kodunu manuel olarak ayarlamak ve null değerini döndürmek korkunçtur.
George


5

NerdDinner'de örn. deneyin bunu

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

Teşekkürler, ancak perde arkasında, bu Dewfy'nin gönderisinde iki numaralı öneriye benzer bir HttpException oluşturur. Sadece kontrolöre / global 404 sayfasına yönlendirmekle kalmayıp, eyleme özgü hoş bir hata sayfası görüntüleyebilmem için biraz daha fazla kontrol arıyorum. Durum kodunu ayarlamak ve özel bir görünüme geri dönmek durumum için gitmek için bir yol gibi görünüyor.
Paul Hiles

4

Yukarıdaki orta çizgiyi ekleyene kadar yukarıdaki örneklerden hiçbiri benim için çalışmadı:

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

2
Bana basit return HttpNotFound();olanın senin için işe yaramadığını mı ciddisin ? Sisteminiz kaç yaşında?
Gone Kodlama

1
Denedin return HttpNotFound();mi MVC 4 ile yukarı doğru iyi çalışır. msdn.microsoft.com/tr-tr/library/… "TrySkipIisCustomErrors özelliği yalnızca uygulamanız IIS 7.0'da barındırılıyorsa kullanılır. IIS 7.0'da Klasik modda çalıştırıldığında TrySkipIisCustomErrors özelliği varsayılan değeri doğrudur. , TrySkipIisCustomErrors özelliği varsayılan değeri yanlıştır. "
Gone Kodlama

2

Kullanırım:

Response.Status = "404 NotFound";

Bu benim için çalışıyor :-)



0

Ayrıca şunları da yapabilirsiniz:

        if (response.Data.IsPresent == false)
        {
            return StatusCode(HttpStatusCode.NoContent);
        }

-1

Lütfen aşağıdaki demo kodunu deneyin:

public ActionResult Test()

{
  return new HttpStatusCodeResult (404,"Not found");
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.