データベースのデータを削除するプログラム
今回は、こちらの記事で作成したプログラムに、データの削除処理を追加します。
データ一覧画面に削除用のリンクを追加
削除画面を呼び出すリンクを、一覧画面に追加します。
呼び出すコントローラーは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のデータがデータベースから削除され、一覧画面に戻ります。
一覧画面では、削除したデータが消えています。