Return 从 MVC 操作过滤器到原始视图
Return to original view from MVC action filter
我正在 asp.net 核心网站上工作,我正在尝试使用过滤器进行一些全局验证异常处理。后端可以在随机位置抛出 fluentapi ValidationException,我想捕获这些并向用户显示错误消息。此过滤器只关心 ValidationExceptions。所有其他异常将在稍后处理..
我不想在所有控制器的每个 post 操作中使用 try/catch,而是想使用一个只捕获 ValidationExceptions 的过滤器,将错误添加到 ModelState,然后 return 使用更新后的 ModelState 到原始视图。
我尝试了很多方法,但每次在过滤器完成后我都得到一个空白页面。我可以使用上下文中的控制器和操作轻松设置新的 RedirectToRouteResult。但是后来我没有用户输入的 ModelState 和值..
public class PostExceptionFilter : ExceptionFilterAttribute
{
public override void OnException(ExceptionContext context)
{
if (context.Exception is FluentValidation.ValidationException)
{
var ex = context.Exception as FluentValidation.ValidationException;
context.Exception = null;
context.HttpContext.Response.StatusCode = 200;
context.ExceptionHandled = true;
foreach (var item in ex.Errors.ToList())
{
context.ModelState.AddModelError(item.PropertyName, item.ErrorMessage);
}
// Done with the stuff I want.
// Now please go back to the original view with the updated modelstate and values
}
else if (context.Exception is UnauthorizedAccessException)
{
// Do something else...
}
else
{
// Do something else...
}
base.OnException(context);
}
}
您无法访问 Exception Filters
中的特定 Model
(与操作方法相关)。因此,如果要将 Errors
添加到模型,则必须在 Controller
级别处理错误。
try
{
//Do something
}
Catch(Exception e)
{
ModelState.AddModelError(string key, string errorMessage);
Return View(model)
}
错误消息将出现在 View
的 <%: Html.ValidationSummary() %>
中
如果没有 try-catch
块,您将不知道 exception
是否发生在操作方法中,以便您可以将自定义错误添加到模型中。
我正在 asp.net 核心网站上工作,我正在尝试使用过滤器进行一些全局验证异常处理。后端可以在随机位置抛出 fluentapi ValidationException,我想捕获这些并向用户显示错误消息。此过滤器只关心 ValidationExceptions。所有其他异常将在稍后处理..
我不想在所有控制器的每个 post 操作中使用 try/catch,而是想使用一个只捕获 ValidationExceptions 的过滤器,将错误添加到 ModelState,然后 return 使用更新后的 ModelState 到原始视图。
我尝试了很多方法,但每次在过滤器完成后我都得到一个空白页面。我可以使用上下文中的控制器和操作轻松设置新的 RedirectToRouteResult。但是后来我没有用户输入的 ModelState 和值..
public class PostExceptionFilter : ExceptionFilterAttribute
{
public override void OnException(ExceptionContext context)
{
if (context.Exception is FluentValidation.ValidationException)
{
var ex = context.Exception as FluentValidation.ValidationException;
context.Exception = null;
context.HttpContext.Response.StatusCode = 200;
context.ExceptionHandled = true;
foreach (var item in ex.Errors.ToList())
{
context.ModelState.AddModelError(item.PropertyName, item.ErrorMessage);
}
// Done with the stuff I want.
// Now please go back to the original view with the updated modelstate and values
}
else if (context.Exception is UnauthorizedAccessException)
{
// Do something else...
}
else
{
// Do something else...
}
base.OnException(context);
}
}
您无法访问 Exception Filters
中的特定 Model
(与操作方法相关)。因此,如果要将 Errors
添加到模型,则必须在 Controller
级别处理错误。
try
{
//Do something
}
Catch(Exception e)
{
ModelState.AddModelError(string key, string errorMessage);
Return View(model)
}
错误消息将出现在 View
<%: Html.ValidationSummary() %>
中
如果没有 try-catch
块,您将不知道 exception
是否发生在操作方法中,以便您可以将自定义错误添加到模型中。