Infos utiles à partir de @Darin Dimitrov qu' HttpNotFoundResult
est en fait le retour de résultats vide.
Après une étude. La solution de contournement pour MVC 3 , ici, est de tirer tous HttpNotFoundResult
, HttpUnauthorizedResult
, HttpStatusCodeResult
classes et de mettre en œuvre de nouvelles (remplaçant) HttpNotFound
() la méthode en BaseController
.
Il est préférable de s'exercer à l'utilisation de la base de Contrôleur de sorte que vous avez un "contrôle" sur tous les dérivés des Contrôleurs.
- Je créer un nouveau HttpStatusCodeResult
classe, de ne pas dériver à partir d' ActionResult
, mais à partir de ViewResult
pour le rendu de la vue ou de tout View
vous voulez en spécifiant l' ViewName
de la propriété. J'ai suivi l'originale HttpStatusCodeResult
pour définir l' HttpContext.Response.StatusCode
et HttpContext.Response.StatusDescription
mais ensuite, base.ExecuteResult(context)
rendra la vue, car encore une fois je dérivent ViewResult
. Assez Simple, est-il? J'espère que ce sera mis en œuvre dans le MVC de base.
Voir mon BaseController
ci-dessous:
using System.Web;
using System.Web.Mvc;
namespace YourNamespace.Controllers
{
public class BaseController : Controller
{
public BaseController()
{
ViewBag.MetaDescription = Settings.metaDescription;
ViewBag.MetaKeywords = Settings.metaKeywords;
}
protected new HttpNotFoundResult HttpNotFound(string statusDescription = null)
{
return new HttpNotFoundResult(statusDescription);
}
protected HttpUnauthorizedResult HttpUnauthorized(string statusDescription = null)
{
return new HttpUnauthorizedResult(statusDescription);
}
protected class HttpNotFoundResult : HttpStatusCodeResult
{
public HttpNotFoundResult() : this(null) { }
public HttpNotFoundResult(string statusDescription) : base(404, statusDescription) { }
}
protected class HttpUnauthorizedResult : HttpStatusCodeResult
{
public HttpUnauthorizedResult(string statusDescription) : base(401, statusDescription) { }
}
protected class HttpStatusCodeResult : ViewResult
{
public int StatusCode { get; private set; }
public string StatusDescription { get; private set; }
public HttpStatusCodeResult(int statusCode) : this(statusCode, null) { }
public HttpStatusCodeResult(int statusCode, string statusDescription)
{
this.StatusCode = statusCode;
this.StatusDescription = statusDescription;
}
public override void ExecuteResult(ControllerContext context)
{
if (context == null)
{
throw new ArgumentNullException("context");
}
context.HttpContext.Response.StatusCode = this.StatusCode;
if (this.StatusDescription != null)
{
context.HttpContext.Response.StatusDescription = this.StatusDescription;
}
// 1. Uncomment this to use the existing Error.ascx / Error.cshtml to view as an error or
// 2. Uncomment this and change to any custom view and set the name here or simply
// 3. (Recommended) Let it commented and the ViewName will be the current controller view action and on your view (or layout view even better) show the @ViewBag.Message to produce an inline message that tell the Not Found or Unauthorized
//this.ViewName = "Error";
this.ViewBag.Message = context.HttpContext.Response.StatusDescription;
base.ExecuteResult(context);
}
}
}
}
À utiliser dans votre action comme ceci:
public ActionResult Index()
{
// Some processing
if (...)
return HttpNotFound();
// Other processing
}
Et dans _Layout.cshtml (comme la page principale)
<div class="content">
@if (ViewBag.Message != null)
{
<div class="inlineMsg"><p>@ViewBag.Message</p></div>
}
@RenderBody()
</div>
En outre, vous pouvez utiliser un affichage personnalisé comme Error.shtml
ou créer de nouveaux NotFound.cshtml
comme je l'ai commenté dans le code et vous pouvez définir un modèle de vue pour le statut de la description et d'autres explications.