Browse Source

added AbpErrorPageOptions and moved the "/error" page to a new controller

pull/2097/head
Yunus Emre Kalkan 7 years ago
parent
commit
e743e662af
  1. 14
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/AbpErrorPageOptions.cs
  2. 64
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Controllers/ErrorController.cs
  3. 11
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Pages/Error/AbpErrorPageModel.cs
  4. 40
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Pages/Error/Default.cshtml
  5. 41
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Pages/Error/Index.cshtml
  6. 69
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Pages/Error/Index.cshtml.cs
  7. 6
      framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/en.json
  8. 6
      framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/tr.json

14
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<string, string> ErrorPageUrls;
public AbpErrorPageOptions()
{
ErrorPageUrls = new Dictionary<string, string>();
}
}
}

64
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> abpErrorPageOptions)
{
_errorInfoConverter = exceptionToErrorInfoConverter;
_statusCodeFinder = httpExceptionStatusCodeFinder;
_abpErrorPageOptions = abpErrorPageOptions.Value;
}
public IActionResult Index(int httpStatusCode)
{
var exHandlerFeature = HttpContext.Features.Get<IExceptionHandlerFeature>();
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;
}
}
}

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

40
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<AbpUiResource> L
@{
var errorMessage = Model.ErrorInfo.Message;
var errorDetails = Model.ErrorInfo.Details;
if (errorDetails.IsNullOrEmpty())
{
errorDetails = errorMessage;
errorMessage = L["Error"].Value + "!";
}
}
<h1>
[@Model.HttpStatusCode] @errorMessage
</h1>
<div>
<p>
@errorDetails
</p>
<p>
@if (!Model.ErrorInfo.ValidationErrors.IsNullOrEmpty())
{
foreach (var validationError in Model.ErrorInfo.ValidationErrors)
{
<text>* </text>@(validationError.Message)
if (validationError.Members != null && validationError.Members.Any())
{
<text>(@string.Join(", ", validationError.Members))</text>
}
<br />
}
}
</p>
</div>

41
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Pages/Error/Index.cshtml

@ -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<AbpUiResource> L
@{
var errorMessage = Model.ErrorInfo.Message;
var errorDetails = Model.ErrorInfo.Details;
if (errorDetails.IsNullOrEmpty())
{
errorDetails = errorMessage;
errorMessage = L["Error"].Value + "!";
}
}
<h1>
[@Model.HttpStatusCode] @errorMessage
</h1>
<div>
<p>
@errorDetails
</p>
<p>
@if (!Model.ErrorInfo.ValidationErrors.IsNullOrEmpty())
{
foreach (var validationError in Model.ErrorInfo.ValidationErrors)
{
<text>* </text>@(validationError.Message)
if (validationError.Members != null && validationError.Members.Any())
{
<text>(@string.Join(", ", validationError.Members))</text>
}
<br />
}
}
</p>
</div>

69
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Pages/Error/Index.cshtml.cs

@ -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<IExceptionHandlerFeature>();
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;
}
}
}

6
framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/en.json

@ -46,6 +46,10 @@
"DatatableActionDropdownDefaultText": "Actions", "DatatableActionDropdownDefaultText": "Actions",
"ChangePassword": "Change password", "ChangePassword": "Change password",
"PersonalInfo": "My profile", "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"
} }
} }

6
framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/tr.json

@ -46,6 +46,10 @@
"DatatableActionDropdownDefaultText": "İşlemler", "DatatableActionDropdownDefaultText": "İşlemler",
"ChangePassword": "Şifre değiştir", "ChangePassword": "Şifre değiştir",
"PersonalInfo": "Profilim", "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"
} }
} }
Loading…
Cancel
Save