如何处理.NET Core Razor页面PageModel中的异常并保持在同一视图上?

时间:2019-01-19 20:28:47

标签: c# razor asp.net-core exception-handling razor-pages

我试图弄清楚如何在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);”失败,我想通过友好的错误消息(以及他们尝试发布的表单数据)使用户停留在同一页面上。

我可以用try / catch块包装OnPost / OnGet ActionMethods,但是,这在所有PageModels中都是多余的,并且使代码肿。

我尝试添加自定义异常处理中间件,尽管它将捕获自定义错误,但它将用户重定向到错误页面。

我还添加了一个自定义的异常过滤器,类似于下面的示例,但这也不会使用户停留在页面上。

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中间件来重定向到特定的错误页面。没有人对如何处理异常但让用户保持一致的看法有任何想法吗?

0 个答案:

没有答案