Lasse Edsvik
Lasse Edsvik

Reputation: 9298

Execute action in other controller on 404

I'm trying to return a action "PageNotFound" that resides in my "Error"-controller.

public class BaseController : Controller
{
 public BaseController()
 {
 }

 public BaseController(IContentRepository contentRep, ILocalizedRepository localRep)
 {
    this._localRep = localRep;
    this._contentRep = contentRep;
 }

 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;
        }

        this.ViewName = "PageNotFound";  // CONTROLLER MISSING
        this.ViewBag.Message = context.HttpContext.Response.StatusDescription;
        base.ExecuteResult(context);
     }
 }

How can I modify it so it returns the "PageNotFound" action in the "Error"- controller?

Upvotes: 0

Views: 161

Answers (3)

SebastianStehle
SebastianStehle

Reputation: 2459

I dont understand why you want to make a redirect. I would return 404

return HttpStatusCode(404);

And then use the approach described here: ASP.NET MVC 404 Error Handling to render the correct view. Benefit: your url is still the same, much easier for error handling and for the browser history.

Upvotes: 1

Darin Dimitrov
Darin Dimitrov

Reputation: 1039110

A ViewResult is supposed to directly render a view (optionally passing a model and a layout). There's no controller involved in this process.

If you want to go through a controller you need to perform redirect, i.e. use RedirectToRouteResult instead of ViewResult.

In your example you are using this custom ViewResult directly inside some other controller. So that will be the controller that will render the error view.

Upvotes: 2

BenM
BenM

Reputation: 4278

Have you tried

return RedirectToAction("PageNotFound", "ControllerName");

Upvotes: 0

Related Questions