C# 如何处理.NET Core Razor pages PageModel中的异常并保持在同一视图中?
我试图找出如何在ASP.NET Core Razor pages站点中连接异常处理,以允许用户在异常发生时保持在同一页面上,并显示友好的错误消息 一旦用户在“编辑”视图上提交表单,如果他们有适当的权限,则调用后端中间层来持久化数据。如果他们没有适当的权限,将从中间层引发自定义验证异常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) {
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;
}