C# 如何处理.NET Core Razor pages PageModel中的异常并保持在同一视图中?

C# 如何处理.NET Core Razor pages PageModel中的异常并保持在同一视图中?,c#,razor,asp.net-core,exception-handling,razor-pages,C#,Razor,Asp.net Core,Exception Handling,Razor Pages,我试图找出如何在ASP.NET Core Razor pages站点中连接异常处理,以允许用户在异常发生时保持在同一页面上,并显示友好的错误消息 一旦用户在“编辑”视图上提交表单,如果他们有适当的权限,则调用后端中间层来持久化数据。如果他们没有适当的权限,将从中间层引发自定义验证异常 private readonly IToolsService m_oToolsService; public EditModel(IToolsService toolsService) {

我试图找出如何在ASP.NET Core Razor pages站点中连接异常处理,以允许用户在异常发生时保持在同一页面上,并显示友好的错误消息

一旦用户在“编辑”视图上提交表单,如果他们有适当的权限,则调用后端中间层来持久化数据。如果他们没有适当的权限,将从中间层引发自定义验证异常

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

无论我做了什么研究,一切似乎都指向使用.NET核心中间件重定向到特定错误页面。是否有人对如何处理异常有任何想法,但要让用户保持在同一视图上?

在模型中添加一个属性,该属性保存异常消息,并将其绑定到视图,在操作中放入try catch,如果发生异常,使用异常详细信息设置模型的属性,并将模型返回到视图,而不执行RedirectToAction是的,我可以在调用中间层代码的每个操作中添加一个try-catch块,并将属性和模型状态设置为invalid并重新显示视图。更具体地说,我想知道是否有一种更好、更全局的方法来实现类似的功能,而不是在每个操作方法中都有一个try-catch块?如果您可以在异常发生时破译调用了什么操作以及来自哪个控制器,难道你不能直接重定向到那个控制器/操作,而不是指向错误页面,并使用更新了异常模型属性的模型吗?
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;
  }