ModelBinder是否应抛出404异常

时间:2012-06-26 16:12:20

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

我开始切换我的控制器以使用模型绑定器进行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时,我想在HttpException方法中抛出BindModel,但我不确定它是否被认为是一种很好的编程习惯。控制器是否负责投掷404或ModelBinder?

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:-1)

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

如果您将Details操作更改为

public ActionResult Details(DomainModel model)
{
}

它向某人询问您是从外部向动作提供模型但是假设动作应该将模型作为视图或json结果返回。想想单元测试?