Controllerクラスに処理を追加する
続いてControllerクラスにLINQを利用して、Index/Details/Edit/Create各アクションメソッドの内容を記述します。
Indexアクションメソッド
Indexアクションメソッドでは、テーブルのデータを一覧表示する記述をします。LINQ部分・ViewDataの扱いなどに特筆すべき点はありません。ポイントは、Viewメソッドの部分です。
using System.Linq;
using System.Web.Mvc;
using SampleMvcApplicationCS.Models;
namespace SampleMvcApplicationCS.Controllers
{
public class PubsController : Controller
{
pubsEntities pubs = new pubsEntities();
<中略>
//
// GET: /Pubs/Index
public ActionResult Index()
{
// titlesテーブルのレコードを全取得
var titles = from t in pubs.titles
select t;
// Index.aspxページにLINQ結果のModelを渡す
return View(titles);
}
<中略>
}
}
前回解説しましたが、ViewメソッドはパラメタにModelを格納できます。今回はテーブルレコードを全取得し、その結果をIndex.aspxへ渡しています。URLルーティング結果は/Pubs/Indexです(図11)。
Detailsアクションメソッド
Detailsアクションメソッドでは、テーブルデータから1レコード選択し、そのデータの詳細を表示させます。
using System.Linq;
using System.Web.Mvc;
using SampleMvcApplicationCS.Models;
namespace SampleMvcApplicationCS.Controllers
{
public class PubsController : Controller
{
pubsEntities pubs = new pubsEntities();
<中略>
//
// GET: /Pubs/Details/5
public ActionResult Details(string id)
{
// titlesテーブルのレコードを全取得
var titles = (from t in pubs.titles
where t.title_id == id
select t).First();
// Details.aspxページにLINQ結果のModelを渡す
return View(titles);
}
<中略>
}
}
最初にパラメタ部分を変更します。今回はtitle_idがView側からパラメタとして渡されますが、その値がstring型なので、既定のint型からstring型へ変更します。
LINQ部分では、パラメタとして渡されたidを利用して該当レコードを絞り込んでいます。また、Firstメソッドを利用して要素を取得し、その値をDetails.aspxへと渡しています。URLルーティング結果は/Pubs/Details/id(そのidによって異なる)です(図12)。
Editアクションメソッド
Editアクションメソッドでは、初回アクセス時にテーブルデータから1レコード選択し、そのデータの詳細を表示させます。続いて、各項目の編集結果をModelに更新し、その後テーブルへと更新結果を反映させます。
using System.Linq;
using System.Web.Mvc;
using SampleMvcApplicationCS.Models;
namespace SampleMvcApplicationCS.Controllers
{
public class PubsController : Controller
{
pubsEntities pubs = new pubsEntities();
<中略>
// 【1】初回アクセス時
// GET: /Pubs/Edit/5
public ActionResult Edit(string id)
{
// titlesテーブルのレコードを全取得
var titles = (from t in pubs.titles
where t.title_id == id
select t).First();
// Edit.aspxページにLINQ結果のModelを渡す
return View(titles);
}
// 【2】編集更新ボタンクリック時
// POST: /Pubs/Edit/5
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(string id, FormCollection collection)
{
// パラメタのtitle_idと一致するレコードを取得
var titles = (from t in pubs.titles
where t.title_id == id
select t).First();
try
{
// 主キーとなるtitle_id以外の項目の更新があればそれを更新する
UpdateModel(titles);
// 更新を反映させる
pubs.SaveChanges();
// Index.aspxページにリダイレクト
return RedirectToAction("Index");
}
catch
{
return View();
}
}
<中略>
}
}
【1】初回アクセス時
Editページへの初回アクセス時、変更対象となるレコードを表示するために、パラメタを利用してLINQで該当レコードを抽出し、その結果をEdit.aspxへ渡しています。URLルーティング結果は/Pubs/Edit/id(そのidによって異なる)です(図13)。
【2】編集更新ボタンクリック時
再度変更対象となるレコードを抽出後、UpdateModelメソッドを使い、主キー以外の項目(今回のサンプルではViewPage側で主キーをHtml.Encodeメソッドを使い更新対象外としています。)で変更があれば、それを更新します。また、Entity Frameworkを活用しているので、EDMからDBへの更新を反映させるSaveChangesメソッドを使い、DBへのレコード更新も行っています。その後、RedirectToActionメソッドにより、Index.aspxページにリダイレクトしています(図14)。




