我希望使用自定义操作筛选器来处理服务类中的特定异常,以填充模型状态,然后返回视图。
例如,以我以前的代码为例:
public ActionResult SomeAction(SomeViewModel model)
{
try
{
_someService.SomeMethod(model);
}
catch (ServiceException ex)
{
ModelState.AddModelError(ex.Key, ex.ErrorMessage);
}
return View();
}基本上,它将调用一个服务,如果抛出一个ServiceException,它将知道存在一个问题w/模型数据,并将错误添加到ModelState中,然后返回视图。但我注意到了一些非常不干燥的模式,因为我在每个操作方法中都有相同的try/catch代码。
因此,为了把它弄干一点,我基本上创建了一个新的HandleServiceError操作过滤器:
public class HandleServiceErrorAttribute : HandleErrorAttribute
{
public override void OnException(ExceptionContext context)
{
((Controller)context.Controller)
.ModelState
.AddModelError(
((ServiceException)context.Exception).Key,
((ServiceException)context.Exception).ErrorMessage
);
context.ExceptionHandled = true;
}
}然后将我的操作方法简化如下:
public ActionResult SomeAction(SomeViewModel model)
{
_someService.SomeMethod(model);
return View();
}问题是,一旦操作过滤器处理了错误,它就不会返回到我的action方法。我有点理解,在引擎盖下,为什么会发生这种事。但我还是想办法做我想做的事。
这个是可能的吗?
提前谢谢。
更新:
我在他的回答中尝试了来自第达林条规定的建议,但是遇到了一些问题,试图在控制器的模型状态下使用构造函数注入。
例如,如果查看它们的Controllers\ProductController.cs代码,就会看到控制器的空构造函数使用服务定位器来创建服务,并在此时传入控制器的ModelState:
public ProductController()
{
_service = new ProductService(new ModelStateWrapper(this.ModelState),
new ProductRepository());
}但是,如果您查看注入的构造函数,它假设ModelState将被注入服务的构造函数中:
public ProductController(IProductService service)
{
_service = service;
}我不知道如何让CI与当前控制器的ModelState一起工作。如果我能解决这个问题,那么这个方法可能会奏效。
发布于 2011-03-28 06:14:50
您仍然可以返回相应的视图:
context.Result = new ViewResult
{
ViewName = context.RouteData.GetRequiredString("action")
};您还可以查看下列条款,以了解如何在服务层执行验证。
https://stackoverflow.com/questions/5454525
复制相似问题