[asp.net_mvc][細節說明]建立簡易MVC網站新增編輯刪除查詢
這是前篇相關文章:[asp.net_mvc]快速建立簡易MVC網站新增編輯刪除查詢
關於index的View:
就是用
@Html.DisplayNameFor(model => model.Email)
顯示table的header
用
@Html.DisplayFor(modelitem => item.EmotionIcon)
顯示資料
用@Html.ActionLink顯示連結去 編輯、細節、刪除,傳入的key的感覺讓我覺得好像回到asp年代,懷念
@Html.ActionLink("編輯", "Edit", new { id = item.No }) |
@Html.ActionLink("細節", "Details", new { id = item.No }) |
@Html.ActionLink("刪除", "Delete", new { id = item.No })
關於index的Contoller:
用泛型顯示資料就像這樣
//這是泛型的方式顯示資料
return View(db.Guestbooks.ToList());
用強型別的話就這樣
//這是改用強型別+LINQ的方式顯示資料
MvcGuestbook.Models.MvcGuestbookContext dbContext = new MvcGuestbookContext();
var model = from p in dbContext.Guestbooks select p;
return View(model);
關於Create 的View:
用
@using (Html.BeginForm())
{
ooxxooxx
}
湊submit的form
用
@Html.LabelFor(model => model.Email)
當顯示欄位名稱的中文
用
@Html.EditorFor(model => model.Email)
@Html.ValidationMessageFor(model => model.Email)
湊編輯欄位以及基本的驗證
用
<input type="submit" value="Create" />
當作送出按鈕
用
@Html.AntiForgeryToken()
當作防止CSRF的攻擊方式(不加的話不能執行)
用
@Html.ValidationSummary(true)
來顯示model property level的錯誤或是ModelState的錯誤
關於Create的Get的Controller:
哈~就這麼簡單一行
return View();
關於Create的Post的Controller:
// POST: /Guestbook/Create
//限定為post
//ValidateAntiForgeryToken防止甚麼攻擊我忘了
//ValidateInput簡易的檢驗input,哈~應該吧
[HttpPost]
[ValidateAntiForgeryToken]
[ValidateInput(true)]//加上這行就可以驗證輸入不合法字元(通常搭配HttpPost使用)
public ActionResult Create(Guestbook guestbook)
{//傳入畫面上的物件
//檢查ModelState是否異常
if (ModelState.IsValid)
{
//沒異常就...存檔
db.Guestbooks.Add(guestbook);
db.SaveChanges();
//然後回到查詢page
return RedirectToAction("Index");
}
//有異常就....回原畫面囉
return View(guestbook);
}
關於DELETE的.cshtml
跟Create挺類似的,一樣是用
@using (Html.BeginForm()) {
}
當作表單內容
用
@Html.DisplayNameFor(model => model.Message)
@Html.DisplayFor(model => model.Message)
顯示要刪除此筆資料的明細以供刪除之前的確認
用整個強型別
@model MvcGuestbook.Models.Guestbook
當作要刪除的資料的參數
最後用
<input type="submit" value="Delete" />
送出資料!就刪除了!這麼簡單!
關於刪除的Controller:
// GET: /Guestbook/Delete/5
//傳入pk當作要刪除的資料的key
//這是get方法,要刪除之前的確認
//根據網路上的說明,要避免直接一個hyperlink進行
//刪除的動作,所以才會有Delete Get的方法
public ActionResult Delete(int id = 0)
{
//利用dbcontext找出該筆資料的明細
Guestbook guestbook = db.Guestbooks.Find(id);
//如果找不到結果,在畫面上顯示找不到
if (guestbook == null)
{
return HttpNotFound();
}
//最後顯示此筆資料的明細提供使用者作刪除之前的確認
return View(guestbook);
}
//
// POST: /Guestbook/Delete/5
//因為刪除只需要pk
//所以傳進來的只有pk
//但是delete 的post以及get就會變成定義模糊不清
//overloading 失敗,所以才會另外取名稱叫做DeleteConfirmed
//並且註明ActionName("Delete")
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public ActionResult DeleteConfirmed(int id)
{ //在delete.cshtml那邊傳進來的是整個強型別物件
//到這邊似乎直接變成id, 不知道multi pk的情況會變成怎樣
//也許傳進來會變成(string orgno,string pno之類的)以後再研究
//用dbcontext找到該筆資料的物件
Guestbook guestbook = db.Guestbooks.Find(id);
//利用dbContext去刪除該筆資料
db.Guestbooks.Remove(guestbook);
db.SaveChanges();
//刪除完畢之後回到查詢頁面
return RedirectToAction("Index");
}
關於編輯的cshtml
用
@using (Html.BeginForm()) {
}
顯示表單
用
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
當作防止CSRF的攻擊方式(不加的話不能執行)
以及開啟欄位驗證
用
@Html.LabelFor(model => model.Message)
顯示欄位的中文名稱
用
@Html.EditorFor(model => model.Message)
@Html.ValidationMessageFor(model => model.Message)
當作欄位的編輯,以及欄位的驗證
最後用
<input type="submit" value="Save" />
送出編輯
關於編輯的controller
//
// GET: /Guestbook/Edit/5
public ActionResult Edit(int id = 0)
{
//Get方法先利用dbContext物件找到此筆資料
Guestbook guestbook = db.Guestbooks.Find(id);
//如果找不到的話顯示錯誤訊息
if (guestbook == null)
{
return HttpNotFound();
}
//最後傳回畫面供使用者編輯
return View(guestbook);
}
//
// POST: /Guestbook/Edit/5
//因為編輯需要更新多個欄位
//所以傳進來的是整個Guestbook物件
//一樣用ValidateAntiForgeryToken防止CSRF攻擊
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(Guestbook guestbook)
{
//post傳進來的
if (ModelState.IsValid)
{
//如果狀態是合法的,就塞入整個guestbook物件,並且
//設定狀態為Modified
db.Entry(guestbook).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(guestbook);
}
終於寫完了,呼...
雖然是內建產生的方法,還是要融會貫通比較好,自我註解一下