I am trying to serve a custom error page in an MVC2 app, which uses the ELMAH for error log (elmah)
I can't seem to reference the page correctly.
The error page is located at ~/Views/Shared/Error.aspx
In the web.config :
<system.web>
<customErrors mode="On" defaultRedirect="~/Shared/Error.aspx"/>
</system.web>
But when I cause an error, expecting the error page, I get:
The resource cannot be found.
Requested URL: /Shared/Error.aspx
smae result even if I modify defaultRedirect to ~/Views/Shared/Error.aspx
What am I doing wrong ?
edit: I obviously don't want to redirect to an action. I just want to display a static generic error page.
You should set defaultRedirect to the path of a route that renders your error page, e.g.
defaultRedirect="/home/error"
Or a static HTML error page, e.g.
defaultRedirect="/error.html"
Related
Am trying to use ELMAH with MVC4 and configured using NUGET Package for MVC.
It handles all the exceptions happening in my code and am logging it to SQL Server.
Using the Ajax Error function am handling AJAX Exceptions(500) Error too. Everything works fine and redirected Error page overriding OnException in Filter Config
But if the user changes the URL and and if the controller doesnt exist am getting Error and not redirected to the Error page.
Ex:
sitename/test -- Correct URL
sitename/tst ---- Getting Server Error instead redirecting to Error page
What is the correct way to handle 404 using ELMAH and redirecting to friendly 404 page in MVC.
I tried changing the Custom Error with 404 in web.config but it didn't worked as expected.
By default all Errors other than 404 am re directing to Error page
Am trying to redirect to friendly 404 page rather than server error page.
Any useful links or code will be helpful .Thanks
============================================
Update web.config
<customErrors mode="On">
<error statusCode="500" redirect="/Views/Shared/Error.cshtml"/>
<error statusCode="404" redirect="/Views/Shared/ErrorNotFound.cshtml"/>
</customErrors>
In ASP.NET MVC, your URL does not represent the View you are displaying. It is the Controller Action. You cannot navigate to a View.
For example, the url ~/Home/Index, does not point to Views/Home/Index.cshtml. It points to the Index method of Controllers/HomeController. This method then renders the Index.cshtml view and returns the result.
So first, you need to create an ErrorController. Then, you need to move your Error Views into a matching Error folder. Now add action methods for Error and ErrorNotFound to your ErrorController, and have them return the correct View.
Finally, change your web.config redirect URL's to ~/Error/ErrorNotFound.
Using this method, you will probably want to change the names of the Controller Actions, and their respective Views to remove the duplicated work Error.
I am using Visual Studio 2012 with the MVC 4 Framework and would like to see the friendly error page of the shared folder, if an exception is unhandled. (I know, as a develepor I need to see the error details but I just wanted to test this setting)
So far I know that adding the following code in the system.web section of web.config should do the trick
<customErrors mode="On" />
Unfortunately instead of my friendly error page I get this:
Server Error in '/' Application.
Runtime Error Description: An application error occurred on the
server. The current custom error settings for this application prevent
the details of the application error from being viewed.
Details: To enable the details of this specific error message to be
viewable on the local server machine, please create a
tag within a "web.config" configuration file located in the root
directory of the current web application. This tag
should then have its "mode" attribute set to "RemoteOnly". To enable
the details to be viewable on remote machines, please set "mode" to
"Off".
<!-- Web.Config Configuration File -->
<configuration>
<system.web>
<customErrors mode="RemoteOnly"/>
</system.web> </configuration>
Notes: The current error page you are seeing can be replaced by a
custom error page by modifying the "defaultRedirect" attribute of the
application's configuration tag to point to a custom
error page URL.
<!-- Web.Config Configuration File -->
<configuration>
<system.web>
<customErrors mode="On" defaultRedirect="mycustompage.htm"/>
</system.web> </configuration>
I would like to do it as described and not with a workaround like adding an action to HomeController, setting routes or something.
A reference that this should work is the following:
http://pluralsight.com/training/players/PSODPlayer?author=scott-allen&name=mvc3-building-controllers&mode=live&clip=0&course=aspdotnet-mvc3-intro
(On left select the chapter "Action Filters" and skip to minute 3:30)
UPDATE (link changed):
http://pluralsight.com/training/Player?author=scott-allen&name=mvc4-building-m2-controllers&mode=live&clip=0&course=mvc4-building
(On top click on the thin line that states "Controller in ASP.NET MVC 4", then click on "Action Filters" and skip to minute 5:00)
Does anybody have a clue why I cannot see the friendly error page with the setting mentioned above?
Thanks in advance!
Here is step by step guide to doing this,
To start with, first set the “customErrors’s” mode property to ‘on’. (This specifies that custom errors are enabled.)
1. Code from Web.config
<system.web>
<customErrors mode="On"></customErrors>
</system.web>
Below is my controller code, I have specified the HandleError attribute on the controller class. Also to generate an error I am throwing an exception from the Index action.
2. Code from HomeController.cs
[HandleError]
public class HomeController : Controller
{
public ActionResult Index()
{
throw new Exception("Error Occured !");
ViewBag.Message = "Welcome to ASP.NET MVC!";
return View();
}
public ActionResult About()
{
return View();
}
}
As you can see in the screenshot below, I have a Error.cshtml view defined inside the Shared folder of the Views folder.
3. Solution Explorer
Note that the Error.cshtml view (shown below) uses a model of ‘System.Web.Mvc.HandleErrorInfo’
4. Code from Error.cshtml
#model System.Web.Mvc.HandleErrorInfo
#{
ViewBag.Title = "Error";
}
<h2>
Sorry, an error occurred while processing your request.
</h2>
On running the project, instead of getting the yellow death screen now I get the following output.
Taken from this article
Update :
Try this out by creating a new project, this should and does work. I suspect that your Error.cshtml file may not have model as #model System.Web.Mvc.HandleErrorInfo or you may be having multiple Error.cshtml pages in different view folders.
I fixed mine.. It's actually the *_Layout* page cannot be rendered because my _Layout.cshtml was strongly typed to a base view model which HandleErrorInfo can't be casted into. And you can never see this page binding error because it only happens when customError is on... that's just great.
One reason that could lead to what you are experiencing:
Something in your _layout is causing an exception to throw when the 'Error.cshtml' is rendering.
Do a test adding
#{
Layout = null;
}
in your 'Error.cshtml' file.
I had the same problem when I was updating the wrong web.config file.
There is a web.config in the Views folder and also under the project application site.
The solution would be to update web.config located under project.
This does not work with Visual Studio Express Edition. It works if you are using Professional or Ultimate Edition of Visual Studio IDE.
I am doing MVC 2
I have given HandleError attribute to all of my controller class.
I have
In my web.config
I also have Error.aspx in my shared folder of views.
Still on an exception in controller, The Error.aspx is not rendered
Steps:
Create a new ASP.NET MVC 2 project using the default template
throw new Exception(); inside the Index action of the HomeController.
Add in web.config: <customErrors mode="On" />
Hit Ctrl+F5 to run the project
The Error.aspx page is shown.
There are a lot of questions about this on StackOverflow because this is a tricky one with a lot of gotchas if you're not careful. From the sound of it, you need to set the HTTP Response to OK, otherwise the server will still render a generic 500 Error page because it still thinks the exception was not handled properly.
To do this, in your error view, add the following code:
#{
Response.StatusCode = (int)HttpStatusCode.OK;
}
Let us know if this works for you!
Edit: You also need to make sure that you have <customErrors mode="On"/> in the <System.Web> section of the web.config file at the root of your website.
I am using MVC 3 with VS2010 and trying to get [HandleError] working. I created a test in the controller to simulate a crash as follows:
[HandleError]
public ActionResult Crash()
{
throw new ApplicationException();
}
Also went into web.config and added:
<customErrors mode="on" />
If I run from Chrome, MVC returns the view in Shared/Error.aspx, so this work ok.
If I run from IE 8, I get its friendly error page ("The website cannot display the page, Most likely causes: ... What you can try..."). I went into IE Tools and turned off "Show friendly HTTP error message" and run again and IE shows my Error.aspx view. Obviously I can't get users to change this setting, but at least I know my Error.aspx is being returned.
So I run Fiddler, and when I make the browser go to my Crash method, it shows that that even though MVC is returning my Error.aspx view, it is returning 500 for the Result. This causes IE to think it has an error and override my page with its friendly page.
I think MVC should be returning Result 200 with my Error.aspx page and not 500. Can anyone give me some ideas on what to try?
If you make your error page > 512 bytes, it should work fine. It's just IE being an inconsiderate swine, as ever.
I working in mvc 2 and need to redirect on error page with exception mesage.
For this I have i have override OnException () action of controller
and trying to do like " View("Error").ExecuteResult(this.ControllerContext);"
but it is throwig exception 'System.Web.Mvc.HttpHandlerUtil+ServerExecuteHttpHandlerWrapper"
please give me the right solution
Regards Munish
The HandleError attribute redirects to the Error page that is placed in the shared folder. This page has a model of type System.Web.Mvc.HandleErrorInfo which contains an Exception property. You should modify the Error page so that it displays the exception information you want, like for example <%:Model.Exception.Message %>.
Also make sure that you have the <customErrors mode="On" /> inside the <system.web> in the web.config file otherwise, during development the HandleErrorAttribute won´t intercept the exceptions.
Good luck!