我如何在ExceptionFilter Asp.NetCore中获取模型对象?

时间:2018-06-23 13:42:40

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

我正在使用ASP.NET Core 2.0中的WEB应用程序,其中有一个自定义ExceptionAttribute过滤器,该过滤器继承自ExceptionFilterAttribute。

如何访问在POST调用中传递给操作的Model对象。

所提到的方法被传递给ExceptionContext,但是我找不到一种简单可靠的方法来从中获取Model对象并传递给ViewResult。

我拥有的过滤器如下所示:

public class ApiCallExceptionAttribute: ExceptionFilterAttribute
{
    private readonly IModelMetadataProvider _modelMetadataProvider;

    public ApiCallExceptionAttribute(
        IModelMetadataProvider modelMetadataProvider)
    {
        _modelMetadataProvider = modelMetadataProvider;
    }

    public override void OnException(ExceptionContext context)
    {
        //how can i accesss model object here and pass to ViewResult
        result.ViewData = new ViewDataDictionary(_modelMetadataProvider,context.ModelState);

        context.Result = result;
    }
}

,控制器如下所示:

[HttpPost]
[ServiceFilter(typeof(ApiCallExceptionAttribute))]
public async Task<IActionResult> Activation(ActivationViewModel model)
{
            //throw exception in controller content
}

1 个答案:

答案 0 :(得分:0)

找不到任何简便的方法。

我将采用的方法是在您的课程上也实现IActionFilter

onActionExecuting()中读取模型的信息,并将其存储在HTTPContext.Items中。

然后在发生异常时从HttpContext.Items中读取它。

不要再将这些信息存储为类中的私有字段,因为MVC不会为每个请求都为其过滤器创建新实例!

 public class LogExceptionFilterAttribute : Attribute, IExceptionFilter, IActionFilter
    {

        public void OnActionExecuting(ActionExecutingContext context)
        {
            context.HttpContext.Items["ActionArguments"] = context.ActionArguments;
        }

        public void OnActionExecuted(ActionExecutedContext context)
        {
        }

        public void OnException(ExceptionContext context)
        {
            var model = context.HttpContext.Items["ActionArguments"];
        }
    }