我正在使用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
}
答案 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"];
}
}