Функция - Функция в независимом фрагменте кода, который включает в себя некоторую логику и , должна вызываться независимо и определяться вне класса.
Метод - метод - это независимая часть кода, которая вызывается со ссылкой на некоторый объект и определяется внутри класса.
Вместо того, чтобы создавать для этого новый маршрут, вы можете просто перенаправить на свой контроллер / действие и передать информацию через строку запроса. Например:
protected void Application_Error(object sender, EventArgs e) {
Exception exception = Server.GetLastError();
Response.Clear();
HttpException httpException = exception as HttpException;
if (httpException != null) {
string action;
switch (httpException.GetHttpCode()) {
case 404:
// page not found
action = "HttpError404";
break;
case 500:
// server error
action = "HttpError500";
break;
default:
action = "General";
break;
}
// clear error on server
Server.ClearError();
Response.Redirect(String.Format("~/Error/{0}/?message={1}", action, exception.Message));
}
Тогда ваш контроллер будет получать все, что вы хотите:
// GET: /Error/HttpError404
public ActionResult HttpError404(string message) {
return View("SomeView", message);
}
Есть некоторые компромиссы с вашим подходом. Будьте очень осторожны с зацикливанием при такой обработке ошибок. Другое дело, что, поскольку вы проходите конвейер asp.net для обработки 404, вы создадите объект сеанса для всех этих обращений. Это может быть проблемой (производительность) для часто используемых систем.
Возможно, лучший способ Обработка ошибок в MVC заключается в применении атрибута HandleError к вашему контроллеру или действию и обновлению файла Shared / Error.aspx для выполнения того, что вы хотите. Объект Model на этой странице включает свойство Exception, а также ControllerName и ActionName.
Ошибка Application_Error с запросами Ajax. Если ошибка обработана в Action, вызываемом Ajax - он отобразит ваш Error View внутри полученного контейнера.
Чтобы ответить на начальный вопрос "как правильно передать маршрутизированные данные контроллеру ошибок?":
IController errorController = new ErrorController();
errorController.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
Затем в классе ErrorController реализуйте такую функцию:
[AcceptVerbs(HttpVerbs.Get)]
public ViewResult Error(Exception exception)
{
return View("Error", exception);
}
Это выталкивает исключение во Вид. Страница просмотра должна быть объявлена так:
<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<System.Exception>" %>
А код для отображения ошибки:
<% if(Model != null) { %> <p><b>Detailed error:</b><br /> <span class="error"><%= Helpers.General.GetErrorMessage((Exception)Model, false) %></span></p> <% } %>
Вот функция, которая собирает все сообщения об исключениях из дерева исключений:
public static string GetErrorMessage(Exception ex, bool includeStackTrace)
{
StringBuilder msg = new StringBuilder();
BuildErrorMessage(ex, ref msg);
if (includeStackTrace)
{
msg.Append("\n");
msg.Append(ex.StackTrace);
}
return msg.ToString();
}
private static void BuildErrorMessage(Exception ex, ref StringBuilder msg)
{
if (ex != null)
{
msg.Append(ex.Message);
msg.Append("\n");
if (ex.InnerException != null)
{
BuildErrorMessage(ex.InnerException, ref msg);
}
}
}
Я боролся с идеей централизации глобальной обработки ошибок в приложении MVC ранее. У меня есть пост на форумах ASP.NET .
Это в основном обрабатывает все ваши ошибки приложений в Global.Asax без необходимости контроллера ошибок, украшать атрибутом [HandlerError]
, или возобновляются с помощью Custruster
узел в web.config.