Как обработать исключение на страницах .NET Core Razor PageModel и остаться в том же виде? - PullRequest
0 голосов
/ 19 января 2019

Я пытаюсь выяснить, как подключить обработку исключений на сайте страниц ASP.NET Core Razor, чтобы позволить пользователю оставаться на той же странице, когда возникает исключение с понятным сообщением об ошибке.

После того, как пользователь отправит форму в представлении «Редактирование», вызовите промежуточный уровень внутреннего уровня, чтобы сохранить данные, если они имеют соответствующие разрешения. Если они не имеют надлежащих разрешений, из среднего уровня выдается пользовательское исключение проверки.

   private readonly IToolsService m_oToolsService;

   public EditModel(IToolsService toolsService)
   {
        m_oToolsService = oToolsService;
   }

   public async Task<IActionResult> OnGetAsync()
   {
        var vm = olsService.GetData():

        // Wire up UI with the ViewModel
        return Page();
   }

    public async Task<IActionResult> OnPostEditAsync(ViewModel vm)
    {
        if (false == ModelState.IsValid)
        {
            return Page();
        }

        m_oToolsService.SaveData(vm);
    }

Если вызов "m_oToolsService.SaveData (vm);" не удается, я бы хотел оставить пользователя на той же странице с дружественным сообщением об ошибке (и с данными формы, которые они пытались опубликовать).

Я мог бы обернуть OnPost / OnGet ActionMethods блоками try / catch, однако это становится избыточным во всех моделях PageModel и увеличивает объем кода.

Я попытался добавить настраиваемую обработку исключений Middleware, и хотя она будет перехватывать пользовательскую ошибку, она перенаправляет пользователя на страницу с ошибкой.

Я также добавил специальный фильтр исключений, аналогичный приведенному ниже примеру, но он также не удерживает пользователя на странице.

public class CustomExceptionFilterAttribute : ExceptionFilterAttribute
{
    private readonly IHostingEnvironment _hostingEnvironment;
    private readonly IModelMetadataProvider _modelMetadataProvider;
    private readonly ITempDataDictionaryFactory _tempDataDictionaryFactory;

    public CustomExceptionFilterAttribute(IHostingEnvironment hostingEnvironment, ITempDataDictionaryFactory tempDataDictionaryFactory, IModelMetadataProvider modelMetadataProvider)
    {
        _hostingEnvironment = hostingEnvironment;
        _modelMetadataProvider = modelMetadataProvider;
        _tempDataDictionaryFactory = tempDataDictionaryFactory;
    }

    public override void OnException(ExceptionContext context)
    {
        if (!_hostingEnvironment.IsDevelopment())
        {
            // do nothing
            return;
        }

        var tempData = _tempDataDictionaryFactory.GetTempData(context.HttpContext);

        var result = new ViewResult
        {
            ViewName = "/Edit",
        };

        context.ExceptionHandled = true; // mark exception as handled
        HttpResponse response = context.HttpContext.Response;
        context.Result = result;
  }

Независимо от того, что я исследую, кажется, все указывает на использование промежуточного программного обеспечения .NET Core для перенаправления на страницу с конкретной ошибкой. У кого-нибудь есть идеи о том, как обрабатывать исключения, но держать пользователя в том же представлении?

...