Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ModelBinder是否应该抛出404异常_C#_.net_Asp.net Mvc_Exception_Http Status Code 404 - Fatal编程技术网

C# ModelBinder是否应该抛出404异常

C# ModelBinder是否应该抛出404异常,c#,.net,asp.net-mvc,exception,http-status-code-404,C#,.net,Asp.net Mvc,Exception,Http Status Code 404,我开始将我的控制器切换到使用模型绑定来执行GET操作,而不是使用int参数。我的常规控制器获取操作如下所示 public ActionResult Details(int id) { DomainModel model = repository.GetById(id); if (model == null) { throw new HttpException(404, "Item does not exist") } //Continue

我开始将我的控制器切换到使用模型绑定来执行GET操作,而不是使用int参数。我的常规控制器获取操作如下所示

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?

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

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


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

因此您有一个GET操作,它根据模型的id返回一个模型。根据MVC的原则,控制器的工作是与模型交互并获取id的相应实例。我认为在模型绑定器中执行该工作并将模型提供给控制器操作是不好的就像把核心任务从控制器上拿走一样

如果将详细信息更改为操作

public ActionResult Details(DomainModel model)
{
}

它看起来像是从外部将模型提供给操作的人,但是假设操作应该将模型作为视图或json结果返回。考虑一下单元测试?

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