From e743e662af9f16caec5ba664c61b2fce8702cd07 Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Wed, 6 Nov 2019 10:38:46 +0300 Subject: [PATCH] added AbpErrorPageOptions and moved the "/error" page to a new controller --- .../AbpErrorPageOptions.cs | 14 ++++ .../Controllers/ErrorController.cs | 64 +++++++++++++++++ .../Pages/Error/AbpErrorPageModel.cs | 11 +++ .../Pages/Error/Default.cshtml | 40 +++++++++++ .../Pages/Error/Index.cshtml | 41 ----------- .../Pages/Error/Index.cshtml.cs | 69 ------------------- .../Localization/Resources/AbpUi/en.json | 6 +- .../Localization/Resources/AbpUi/tr.json | 6 +- 8 files changed, 139 insertions(+), 112 deletions(-) create mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/AbpErrorPageOptions.cs create mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Controllers/ErrorController.cs create mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Pages/Error/AbpErrorPageModel.cs create mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Pages/Error/Default.cshtml delete mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Pages/Error/Index.cshtml delete mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Pages/Error/Index.cshtml.cs diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/AbpErrorPageOptions.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/AbpErrorPageOptions.cs new file mode 100644 index 0000000000..30df5af36e --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/AbpErrorPageOptions.cs @@ -0,0 +1,14 @@ +using System.Collections.Generic; + +namespace Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared +{ + public class AbpErrorPageOptions + { + public readonly IDictionary ErrorPageUrls; + + public AbpErrorPageOptions() + { + ErrorPageUrls = new Dictionary(); + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Controllers/ErrorController.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Controllers/ErrorController.cs new file mode 100644 index 0000000000..ded8f2d352 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Controllers/ErrorController.cs @@ -0,0 +1,64 @@ +using System; +using System.Collections.Generic; +using Microsoft.AspNetCore.Diagnostics; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Options; +using Volo.Abp.AspNetCore.ExceptionHandling; +using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Pages.Error; + +namespace Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Controllers +{ + public class ErrorController : AbpController + { + private readonly IExceptionToErrorInfoConverter _errorInfoConverter; + private readonly IHttpExceptionStatusCodeFinder _statusCodeFinder; + private readonly AbpErrorPageOptions _abpErrorPageOptions; + + public ErrorController( + IExceptionToErrorInfoConverter exceptionToErrorInfoConverter, + IHttpExceptionStatusCodeFinder httpExceptionStatusCodeFinder, IOptions abpErrorPageOptions) + { + _errorInfoConverter = exceptionToErrorInfoConverter; + _statusCodeFinder = httpExceptionStatusCodeFinder; + _abpErrorPageOptions = abpErrorPageOptions.Value; + } + + public IActionResult Index(int httpStatusCode) + { + var exHandlerFeature = HttpContext.Features.Get(); + + var exception = exHandlerFeature != null + ? exHandlerFeature.Error + : new Exception("Unhandled exception!"); //TODO: Localize? + + var errorInfo = _errorInfoConverter.Convert(exception); + + if (httpStatusCode == 0) + { + httpStatusCode = (int)_statusCodeFinder.GetStatusCode(HttpContext, exception); + } + + HttpContext.Response.StatusCode = httpStatusCode; + + var page = GetErrorPageUrl(httpStatusCode); + + return View(page, new AbpErrorPageModel + { + ErrorInfo = errorInfo, + HttpStatusCode = httpStatusCode + }); + } + + private string GetErrorPageUrl(int statusCode) + { + var page = _abpErrorPageOptions.ErrorPageUrls.GetOrDefault(statusCode.ToString()); + + if (string.IsNullOrWhiteSpace(page)) + { + return "~/Pages/Error/Default.cshtml"; + } + + return page; + } + } +} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Pages/Error/AbpErrorPageModel.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Pages/Error/AbpErrorPageModel.cs new file mode 100644 index 0000000000..eeb1793fa5 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Pages/Error/AbpErrorPageModel.cs @@ -0,0 +1,11 @@ +using Volo.Abp.Http; + +namespace Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Pages.Error +{ + public class AbpErrorPageModel + { + public RemoteServiceErrorInfo ErrorInfo { get; set; } + + public int HttpStatusCode { get; set; } + } +} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Pages/Error/Default.cshtml b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Pages/Error/Default.cshtml new file mode 100644 index 0000000000..f1c6bb91d3 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Pages/Error/Default.cshtml @@ -0,0 +1,40 @@ +@using System.Linq +@using System.Collections.Generic +@using Localization.Resources.AbpUi +@using Microsoft.AspNetCore.Mvc.Localization +@using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Pages.Error +@model AbpErrorPageModel +@inject IHtmlLocalizer L + @{ + var errorMessage = Model.ErrorInfo.Message; + var errorDetails = Model.ErrorInfo.Details; + if (errorDetails.IsNullOrEmpty()) + { + errorDetails = errorMessage; + errorMessage = L["Error"].Value + "!"; + } + } + +

+ [@Model.HttpStatusCode] @errorMessage +

+ +
+

+ @errorDetails +

+

+ @if (!Model.ErrorInfo.ValidationErrors.IsNullOrEmpty()) + { + foreach (var validationError in Model.ErrorInfo.ValidationErrors) + { + * @(validationError.Message) + if (validationError.Members != null && validationError.Members.Any()) + { + (@string.Join(", ", validationError.Members)) + } +
+ } + } +

+
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Pages/Error/Index.cshtml b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Pages/Error/Index.cshtml deleted file mode 100644 index 421363f8b9..0000000000 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Pages/Error/Index.cshtml +++ /dev/null @@ -1,41 +0,0 @@ -@page -@using System.Linq -@using System.Collections.Generic -@using Localization.Resources.AbpUi -@using Microsoft.AspNetCore.Mvc.Localization -@using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Pages.Error -@model IndexModel -@inject IHtmlLocalizer L -@{ - var errorMessage = Model.ErrorInfo.Message; - var errorDetails = Model.ErrorInfo.Details; - if (errorDetails.IsNullOrEmpty()) - { - errorDetails = errorMessage; - errorMessage = L["Error"].Value + "!"; - } -} - -

- [@Model.HttpStatusCode] @errorMessage -

- -
-

- @errorDetails -

-

- @if (!Model.ErrorInfo.ValidationErrors.IsNullOrEmpty()) - { - foreach (var validationError in Model.ErrorInfo.ValidationErrors) - { - * @(validationError.Message) - if (validationError.Members != null && validationError.Members.Any()) - { - (@string.Join(", ", validationError.Members)) - } -
- } - } -

-
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Pages/Error/Index.cshtml.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Pages/Error/Index.cshtml.cs deleted file mode 100644 index 66ea202442..0000000000 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Pages/Error/Index.cshtml.cs +++ /dev/null @@ -1,69 +0,0 @@ -using System; -using Microsoft.AspNetCore.Diagnostics; -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Mvc.RazorPages; -using Volo.Abp.AspNetCore.ExceptionHandling; -using Volo.Abp.Http; - -namespace Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Pages.Error -{ - public class IndexModel : PageModel - { - public RemoteServiceErrorInfo ErrorInfo { get; set; } - - [BindProperty(SupportsGet = true)] - public int HttpStatusCode { get; set; } - - private readonly IExceptionToErrorInfoConverter _errorInfoConverter; - private readonly IHttpExceptionStatusCodeFinder _statusCodeFinder; - - public IndexModel(IExceptionToErrorInfoConverter errorInfoConverter, IHttpExceptionStatusCodeFinder statusCodeFinder) - { - _errorInfoConverter = errorInfoConverter; - _statusCodeFinder = statusCodeFinder; - } - - public void OnGet() - { - HandleError(); - } - - public void OnPost() - { - HandleError(); - } - - public void OnPut() - { - HandleError(); - } - - public void OnDelete() - { - HandleError(); - } - - public void OnPatch() - { - HandleError(); - } - - private void HandleError() - { - var exHandlerFeature = HttpContext.Features.Get(); - - var exception = exHandlerFeature != null - ? exHandlerFeature.Error - : new Exception("Unhandled exception!"); //TODO: Localize? - - ErrorInfo = _errorInfoConverter.Convert(exception); - - if (HttpStatusCode == 0) - { - HttpStatusCode = (int)_statusCodeFinder.GetStatusCode(HttpContext, exception); - } - - HttpContext.Response.StatusCode = HttpStatusCode; - } - } -} \ No newline at end of file diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/en.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/en.json index 7aafe07612..9dee3c9b69 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/en.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/en.json @@ -46,6 +46,10 @@ "DatatableActionDropdownDefaultText": "Actions", "ChangePassword": "Change password", "PersonalInfo": "My profile", - "AreYouSureYouWantToCancelEditingWarningMessage": "You have unsaved changes." + "AreYouSureYouWantToCancelEditingWarningMessage": "You have unsaved changes.", + "401Message": "Unauthorized", + "403Message": "Forbidden", + "404Message": "Page not found", + "500Message": "Internal Server Error" } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/tr.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/tr.json index 5b236f8954..169ff854f4 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/tr.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/tr.json @@ -46,6 +46,10 @@ "DatatableActionDropdownDefaultText": "İşlemler", "ChangePassword": "Şifre değiştir", "PersonalInfo": "Profilim", - "AreYouSureYouWantToCancelEditingWarningMessage": "Kaydedilmemiş değişiklikler var." + "AreYouSureYouWantToCancelEditingWarningMessage": "Kaydedilmemiş değişiklikler var.", + "401Message": "Yetkisiz", + "403Message": "Yasak", + "404Message": "Sayfa bulunamadı", + "500Message": "Sunucu tarafında hata" } } \ No newline at end of file