「ホーム」のCRUDシナリオを処理するコントローラがあるとします。 Getは次のようになります。異なるHTTPメソッドを持つRESTfulコントローラ、ただし同じパラメータ
[HttpGet]
public ActionResult Index(int? homeId)
{
Home home = homeRepo.GetHome(homeId.Value);
return Json(home, JsonRequestBehavior.AllowGet);
}
これまでのところとても良いです。次に、新しいアクションを追加するためのポストアクションを追加します。
[HttpPost]
public ActionResult Index(Home home)
{
//add the new home to the db
return Json(new { success = true });
}
驚くばかりです。しかし、私はputs(既存の家を更新する)を処理するために同じスキームを使用するとき...
[HttpPut]
public ActionResult Index(Home home)
{
//update existing home in the db
return Json(new { success = true });
}
私たちは問題に遭遇します。ポストとプットのメソッドシグネチャは同じですが、もちろんC#ではそうではありません。署名に偽のパラメータを追加する、CRUDを直接反映するようにメソッド名を変更するなど、いくつか試してみることができます。しかし、それらはハッキーまたは望ましくないです。
ここでRESTfulなCRUDスタイルのコントローラを保存するためのベストプラクティスは何ですか?基本的にはActionNameAttribute
がこれらのシナリオに対処するために作成された
[HttpPut]
[ActionName("Index")]
public ActionResult IndexPut(Home home)
{
...
}
:
なぜあなたは名前が変わっているか望ましくないものを変更することを検討していますか?これらのメソッドは異なる目的を果たすので、私は彼らが異なる名前にふさわしいと言います。 –
RESTfulなアプローチでは、異なるHttpMethods(Create = Post、Read = Get、Update = Put、Delete = Delete)を使用して、すべて同じURLに解決する必要があるためです。それにはたくさんの理由がありますが、ほとんどの場合、これをはるかに簡単に作成できるjavascript APIが作成されます。小さくても。 – Dusda
そうですね、Mattのソリューションは素晴らしいです。 C#コードをコンパイルしたまま、外部APIをRESTfulに保ちます。 –