[asp.net_mvc][細節說明]建立簡易MVC網站新增編輯刪除查詢

  • 7316
  • 0
  • 2016-06-03

[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);
        }

終於寫完了,呼...

雖然是內建產生的方法,還是要融會貫通比較好,自我註解一下