データベースのデータを削除するプログラム
今回は、こちらの記事で作成したプログラムに、データの削除処理を追加します。
データ一覧画面に削除用のリンクを追加
削除画面を呼び出すリンクを、一覧画面に追加します。
呼び出すコントローラーはDeleteController、呼び出すメソッドはDeleteConfirm()とします。
また、HTMLヘルパーのActionLink()メソッドは、コントローラーとNew Withでオプションを指定しているため、最後にNothingが必要になります。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | @ModelType IEnumerable(Of Emp) @Code     ViewData("Title") = "Index" End Code <table>     <tr>         <th>@Html.ActionLink(Html.DisplayNameFor(Function(model) model.Id).ToString, "Sort", New With {.skey = "Id"})</th>         <th>@Html.ActionLink(Html.DisplayNameFor(Function(model) model.Name).ToString, "Sort", New With {.skey = "Name"})</th>         <th>@Html.ActionLink(Html.DisplayNameFor(Function(model) model.Address).ToString, "Sort", New With {.skey = "Address"})</th>         <th>@Html.ActionLink(Html.DisplayNameFor(Function(model) model.Birthday).ToString, "Sort", New With {.skey = "Birthday"})</th>         <th>@Html.ActionLink(Html.DisplayNameFor(Function(model) model.Email).ToString, "Sort", New With {.skey = "Email"})</th>         <th colspan="2"></th>     </tr>     @For Each item In Model         @<tr>             <td>@Html.DisplayFor(Function(model) item.Id)</td>             <td>@Html.DisplayFor(Function(model) item.Name)</td>             <td>@Html.DisplayFor(Function(model) item.Address)</td>             <td>@Html.DisplayFor(Function(model) item.Birthday)</td>             <td>@Html.DisplayFor(Function(model) item.Email)</td>             <td>@Html.ActionLink("更新", "Update", "Update", New With {.id = item.Id}, Nothing)</td>             <td>@Html.ActionLink("削除", "DeleteConfirm", "Delete", New With {.id = item.Id}, Nothing)</td>         </tr>     Next </table> <div class="index-link">     @Html.ActionLink("新規登録", "Insert", "Insert") </div> | 
下図のように、削除画面へのリンクがデータ一覧の横に配置されます。

データ削除用のコントローラーを作成
新規にデータ削除用のコントローラーを作成します。
コントローラーには、データ確認用(DeleteConfirm)、データ削除用(DeleteDb)の2つのメソッドを作成します。
DeleteConfirm()メソッドは、選択したデータのIDが渡され、そのIDをキーとして、Find()メソッドを使ってEmpテーブルからデータを取得します。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | Imports System.Web.Mvc Namespace Controllers     Public Class DeleteController         Inherits Controller         Private db As New TestDbEntities         Function DeleteConfirm(id As Integer) As ActionResult             Dim emp As Emp = db.Emp.Find(id)             Return View(emp)         End Function         <HttpPost>         Function DeleteDb(id As Integer) As ActionResult             Dim model As New DbModel             model.DeleteEmp(id)             Return RedirectToAction("Index", "Home")         End Function     End Class End Namespace | 
データ削除用の処理を追加
既存のDbModelクラスに、データベースのデータを削除するメソッド(DeleteEmp)を追加します。
引数で渡されたIDを使って該当するデータを取得し、Remove()メソッドを使って削除します。
データを登録した後に、SaveChanges()メソッドでデータベースの状態を保存します。
データ登録に関する詳しい内容は、以下のマイクロソフトの公式サイトを参照してください。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | Imports System.Data.Entity Imports System.Web.Mvc Public Class DbModel     Function GetEmp(skey As String) As List(Of Emp)         Dim emp As List(Of Emp)         Using db As New TestDbEntities             Select Case skey                 Case "Id"                     emp = db.Emp.OrderBy(Function(s) s.Id).ToList                 Case "Name"                     emp = db.Emp.OrderBy(Function(s) s.Name).ToList                 Case "Address"                     emp = db.Emp.OrderBy(Function(s) s.Address).ToList                 Case "Birthday"                     emp = db.Emp.OrderBy(Function(s) s.Birthday).ToList                 Case "Email"                     emp = db.Emp.OrderBy(Function(s) s.Email).ToList                 Case Else                     emp = db.Emp.OrderBy(Function(s) s.Id).ToList             End Select         End Using         Return emp     End Function     Sub InsertEmp(emp As Emp)         Using db As New TestDbEntities             db.Emp.Add(emp)             db.SaveChanges()         End Using     End Sub     Sub UpdateEmp(emp As Emp)         Using db As New TestDbEntities             db.Entry(emp).State = EntityState.Modified             db.SaveChanges()         End Using     End Sub     Sub DeleteEmp(id As Integer)         Using db As New TestDbEntities             Dim emp As Emp = db.Emp.Find(id)             db.Emp.Remove(emp)             db.SaveChanges()         End Using     End Sub End Class | 
データ確認用のビューを作成
削除するデータを確認するためのビューを作成します。
値を表示するDisplayFor()メソッドは、Formでデータを渡すことができないので、HiddenFor()メソッドを使って、値をDeleteDb()メソッドに渡します。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | @ModelType Emp @Code     ViewData("Title") = "Delete" End Code <div class="input-container">     <div class="input-box1">         <p class="input-label">@Html.LabelFor(Function(model) model.Id):</p>         <p class="input-label">@Html.LabelFor(Function(model) model.Name):</p>         <p class="input-label">@Html.LabelFor(Function(model) model.Address):</p>         <p class="input-label">@Html.LabelFor(Function(model) model.Birthday):</p>         <p class="input-label">@Html.LabelFor(Function(model) model.Email):</p>     </div>     <div class="input-box2">         <p>@Html.DisplayFor(Function(model) model.Id)</p>         <p>@Html.DisplayFor(Function(model) model.Name)</p>         <p>@Html.DisplayFor(Function(model) model.Address)</p>         <p>@Html.DisplayFor(Function(model) model.Birthday)</p>         <p>@Html.DisplayFor(Function(model) model.Email)</p>         @Using (Html.BeginForm("DeleteDb", "Delete", FormMethod.Post))             @Html.HiddenFor(Function(model) model.Id)             @<div class="button">                 <input type="submit" value="削除" />                 <input type="button" value="戻る" onclick="backIndex()" />             </div>         End Using     </div> </div> | 
データ確認画面は、以下のようになります。
以下の例は、IDが4のデータを削除しようとしています。

「削除」ボタンを押下すると、指定したIDのデータがデータベースから削除され、一覧画面に戻ります。
一覧画面では、削除したデータが消えています。
