首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用HandleError处理模型状态错误

如何使用HandleError处理模型状态错误
EN

Stack Overflow用户
提问于 2011-03-28 03:58:59
回答 1查看 3.4K关注 0票数 5

我希望使用自定义操作筛选器来处理服务类中的特定异常,以填充模型状态,然后返回视图。

例如,以我以前的代码为例:

代码语言:javascript
复制
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操作过滤器:

代码语言:javascript
复制
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;
    }
}

然后将我的操作方法简化如下:

代码语言:javascript
复制
public ActionResult SomeAction(SomeViewModel model)
{
    _someService.SomeMethod(model);
    return View();
}

问题是,一旦操作过滤器处理了错误,它就不会返回到我的action方法。我有点理解,在引擎盖下,为什么会发生这种事。但我还是想办法做我想做的事。

这个是可能的吗?

提前谢谢。

更新:

我在他的回答中尝试了来自第达林条规定的建议,但是遇到了一些问题,试图在控制器的模型状态下使用构造函数注入。

例如,如果查看它们的Controllers\ProductController.cs代码,就会看到控制器的空构造函数使用服务定位器来创建服务,并在此时传入控制器的ModelState:

代码语言:javascript
复制
public ProductController() 
{
    _service = new ProductService(new ModelStateWrapper(this.ModelState), 
                                  new ProductRepository());
}

但是,如果您查看注入的构造函数,它假设ModelState将被注入服务的构造函数中:

代码语言:javascript
复制
public ProductController(IProductService service)
{
    _service = service;
}

我不知道如何让CI与当前控制器的ModelState一起工作。如果我能解决这个问题,那么这个方法可能会奏效。

EN

回答 1

Stack Overflow用户

发布于 2011-03-28 06:14:50

您仍然可以返回相应的视图:

代码语言:javascript
复制
context.Result = new ViewResult
{
    ViewName = context.RouteData.GetRequiredString("action")
};

您还可以查看下列条款,以了解如何在服务层执行验证。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5454525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档