【问题标题】:Should a ModelBinder throw a 404 ExceptionModelBinder 是否应该抛出 404 异常
【发布时间】:2012-06-28 00:28:12
【问题描述】:

我开始切换我的控制器以使用模型绑定器进行 GET 操作,而不是使用 int 参数。我的普通控制器 GET 操作如下所示...

public ActionResult Details(int id)
{
    DomainModel model = repository.GetById(id);
    if (model == null)
    {
        throw new HttpException(404, "Item does not exist")
    }

    //Continue along with our controller action
}

当切换到 ModelBinder 时,我想在 BindModel 方法中抛出 HttpException,但是我不确定这是否被认为是一种好的编程习惯。控制器是否负责抛出 404 或 ModelBinder?

【问题讨论】:

  • 为什么要从 int 切换控制器操作?
  • @Mark 所以我不必一直向数据库写入查询以通过 id 获取模型
  • 但无论如何,您必须访问数据库才能获取正确的详细信息?
  • @Mark 是的,这只会减少我的控制器操作中的代码量。我仍然需要访问数据库。

标签: c# .net asp.net-mvc exception http-status-code-404


【解决方案1】:

模型绑定就是这样做的,绑定模型。如果模型不存在,它将返回 null 或 Null 对象。然后控制器可以决定如何处理模型。如果为 null,则抛出。

但是,如果您看到出现相同的代码行,那么封装该代码是一个好主意。一种选择是使用 ActionFilter。模型绑定器创建对象,如果模型为空,动作过滤器可以将响应代码设置为 404。

在这种情况下,您的控制器只需要担心“快乐路径”。那就是模型存在。

【讨论】:

    【解决方案2】:

    所以你有一个 GET 操作,它根据它的 id 返回一个模型。根据 MVC 的原理,与模型交互并获取 id 的相应实例是控制器的工作。我认为在模型绑定器中完成这项工作并将模型提供给控制器操作并不是一个好主意,这就像将核心工作从控制器中移开一样。

    如果您将Details 操作更改为,

    public ActionResult Details(DomainModel model)
    {
    }
    

    看起来你正在将模型从外部提供给动作,但假设动作应该将模型作为视图或 json 结果返回。考虑单元测试?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-21
      • 1970-01-01
      • 1970-01-01
      • 2013-05-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多