Details メソッドと Delete アクション メソッドの確認
作成者 : Rick Anderson
Note
このチュートリアルの更新版は、MVC 5 と Visual Studio 2013 ASP.NET 使用するこちらにあります。 より安全で、フォローする方がはるかに簡単で、より多くの機能を示します。
チュートリアルのこの部分では、自動的に生成された Details
メソッドと Delete
メソッドについて説明します。
Details メソッドと Delete メソッドの確認
コントローラーを Movie
開き、 メソッドを Details
調べます。
public ActionResult Details(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Movie movie = db.Movies.Find(id);
if (movie == null)
{
return HttpNotFound();
}
return View(movie);
}
このアクション メソッドを作成した MVC スキャフォールディング エンジンは、メソッドを呼び出す HTTP 要求を示すコメントを追加します。 この場合は、コントローラー、 GET
メソッド、 Movies
値の 3 つの URL セグメントを Details
含む要求です ID
。
Code First を使用すると、 メソッドを使用してデータを簡単に Find
検索できます。 メソッドに組み込まれている重要なセキュリティ機能は、コードがムービーに対して何かを実行する前に、メソッドがムービーを見つけたことを Find
確認することです。 たとえば、ハッカーは、リンクによって作成される URL を http://localhost:xxxx/Movies/Details/1
から http://localhost:xxxx/Movies/Details/12345
など (または、実際のムービーを表していないその他の値) に変更することで、サイトでエラーを発生させる可能性があります。 null ムービーをチェックしなかった場合、null ムービーはデータベース エラーになります。
Delete
メソッドと DeleteConfirmed
メソッドを調べます。
// GET: /Movies/Delete/5
public ActionResult Delete(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Movie movie = db.Movies.Find(id);
if (movie == null)
{
return HttpNotFound();
}
return View(movie);
}
// POST: /Movies/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public ActionResult DeleteConfirmed(int id)
{
Movie movie = db.Movies.Find(id);
db.Movies.Remove(movie);
db.SaveChanges();
return RedirectToAction("Index");
}
メソッドは HTTP Get``Delete
指定されたムービーを削除せず、削除を送信 (HttpPost
) できるムービーのビューを返します。 GET 要求の応答で削除操作を実行すると (さらに言えば、編集操作、作成操作、データを変更するその他のあらゆる操作を実行すると)、セキュリティに穴が空きます。 詳細については、「 MVC Tip #46 - セキュリティ ホールを作成するため、リンクの削除 ASP.NET 使用しない」の「Stephen Walther のブログ エントリ」を参照してください。
データを削除する HttpPost
メソッドの名前は「DeleteConfirmed
」になり、HTTP POST メソッドに一意のシグネチャまたは名前が与えられます。 2 つのメソッド シグネチャは下の画像のようになります。
// GET: /Movies/Delete/5
public ActionResult Delete(int? id)
//
// POST: /Movies/Delete/5
[HttpPost, ActionName("Delete")]
public ActionResult DeleteConfirmed(int id)
共通言語ランタイム (CLR) は、オーバーロードのメソッドに一意のパラメーター シグネチャを持つことを要求します (メソッド名は同じであるが、パラメーターの一覧が異なる)。 ただし、ここでは、2 つの Delete メソッド (GET 用と POST 用) が必要です。両方とも同じパラメーター シグネチャを持っています。 (いずれも、1 つの整数をパラメーターとして受け取る必要があります。)
これを整理するために、いくつかのことを行うことができます。 1 つは、 メソッドに異なる名前を付ける方法です。 先の例では、スキャフォールディング メカニズムがこれを行いました。 しかし、これは小さな問題を引き起こします。ASP.NET が URL のセグメントをアクション メソッドに名前でマッピングします。メソッドの名前を変更すると、通常、ルーティングでそのメソッドが見つからなくなります。 この解決策はこの例で確認できます。ActionName("Delete")
属性を DeleteConfirmed
メソッドに追加しています。 これにより、ルーティング システムのマッピングが効果的に実行され、POST 要求の /Delete/を含む URL で メソッドが DeleteConfirmed
見つかります。
同じ名前とシグネチャを持つメソッドの問題を回避するもう 1 つの一般的な方法は、未使用のパラメーターを含むように POST メソッドのシグネチャを人為的に変更することです。 たとえば、一部の開発者は、POST メソッドに渡されるパラメーター型 FormCollection
を追加し、単に パラメーターを使用しません。
public ActionResult Delete(FormCollection fcNotUsed, int id = 0)
{
Movie movie = db.Movies.Find(id);
if (movie == null)
{
return HttpNotFound();
}
db.Movies.Remove(movie);
db.SaveChanges();
return RedirectToAction("Index");
}
まとめ
これで、ローカル DB データベースにデータを格納する完全な ASP.NET MVC アプリケーションが完成しました。 ムービーの作成、読み取り、更新、削除、検索を行うことができます。
次の手順
Web アプリケーションをビルドしてテストした後、次の手順は、他のユーザーがインターネット経由で使用できるようにすることです。 そのためには、Web ホスティング プロバイダーにデプロイする必要があります。 Microsoft は、無料の Windows Azure 試用版アカウントで最大 10 個の Web サイトに無料の Web ホスティングを提供しています。 次に、チュートリアル「メンバーシップ、OAuth、SQL Databaseを使用してセキュリティで保護された ASP.NET MVC アプリを Windows Azure Web サイトにデプロイする」に従うことをお勧めします。 優れたチュートリアルは、Tom Dykstra の中間レベルの ASP.NET MVC アプリケーション用の Entity Framework データ モデルの作成です。 Stackoverflow と ASP.NET MVC フォーラム は、質問するのに最適な場所です。 Twitterで 私 に従ってください、あなたは私の最新のチュートリアルで更新を取得することができます。
フィードバックは大歓迎です。
— Rick Anderson twitter: @RickAndMSFT
— Scott Hanselman twitter: @shanselman