1

intパラメーターを使用する代わりに、GETアクションにモデルバインダーを使用するようにコントローラーを切り替え始めています。私の通常のコントローラーの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をスローする責任がありますか?

4

2 に答える 2

1

モデルバインディングはまさにそれを行い、モデルをバインドします。モデルが存在しない場合は、nullまたはNullオブジェクトのいずれかが返されます。その後、コントローラーはモデルをどう処理するかを決定できます。nullの場合は、スローします。

ただし、同じ行のコードが表示される場合は、そのコードをカプセル化することをお勧めします。1つのオプションは、ActionFilterを使用することです。モデルバインダーはオブジェクトを作成し、モデルがnullの場合、アクションフィルターは応答コードを404に設定できます。

このシナリオでは、コントローラーは「ハッピーパス」についてのみ心配する必要があります。つまり、モデルが存在します。

于 2012-06-26T16:21:18.193 に答える
-1

したがって、IDに基づいてモデルを返すGETアクションがあります。MVCの原則に従って、モデルと対話し、IDに対応するインスタンスを取得するのはコントローラーの仕事です。モデルバインダーでその作業を行い、モデルをコントローラーアクションにフィードするのは良い考えではないと思います。これは、コントローラーからコアジョブを取り除くようなものです。

Detailsアクションをに変更すると、

public ActionResult Details(DomainModel model)
{
}

モデルを外部からアクションにフィードしている人に見えますが、アクションはモデルをビューまたはjsonの結果として返す必要があると想定されています。ユニットテストについて考えますか?

于 2012-06-26T16:53:16.933 に答える