iT邦幫忙

2022 iThome 鐵人賽

DAY 18
0
自我挑戰組

用 30 天和 ASP.NET Core 打造一個活動報名管理系統系列 第 18

ASP.NET Core - 活動報名管理系統:Day18 將 CRUD 的前後端寫好 - 1

  • 分享至 

  • xImage
  •  

前言

先前我們導入了 Repository Pattern 以及將 Events 的瀏覽功能寫好了,為了讓整體功能更完整,今天就把新增、編輯以及讀取都寫好吧!

修改 Create 與 Edit

Create

Repository

原本還是使用 DbContext 來儲存資料,現在改為透過 Repository:

View

雖說後端新增功能已經可以運作了,不過在前端輸入欄位的部分,還是可以調整得更好,e.g. SimpleInfo、FullInfo 使用 Textarea 會更好,PersonalSite 可以加入合法網址列的驗證:

運用 Tag Helper,將原本的 input 改成使用 textareaspan 必須留下,因為它是用來顯示錯誤訊息的:

FullIntro 也一併修改。

Edit

ViewModel

修改的部分則要再新增一個 ViewModel,因為原本的 EventsCreateViewModel 包含著 CreateTimeCreateUser,而修改時需要異動的則是 UpdateTimeUpdateUser,所以必須要再建立一個 ViewModel:

View

  • 將引用的 Model 從 Events 改成 EventsEditViewModel
  • Line 47: 將 CategoryId 改為 Enum 下拉選單。
  • 註解的部分則是要刪除的部分。

接下來將 EventsInfo 的欄位加上去,要特別注意,還要加上 EventsInfoofEventsIdEventsInfoId,如此在 Model Binding 時才能綁定 PK, FK:

Repository

編輯的部分需要實作兩個 Function,分別是 UpdateEventAsync()GetEventByIdAsync(),原因是點擊進 Edit 頁面時,需要先到後端撈此活動資料,而送到後端則是修改資料表的內容:

  1. UpdateEventAsync()

    • GetEvents() 一樣畫葫蘆,只不過這裡在做 Update,以及為了符合原本 Controller 就是使用非同步的 Function,所以在 Interface 也新增了非同步的 UpdateEventAsync() Function,以及在 Repository 實作此 Function(但老實說我目前還不懂非同步程式的運作,專案完成到一個階段後來好好瞭解一下。):
  2. GetEventByIdAsync()

    • 要注意的是,不只要撈取 Event 資料,同時也要用 Events.Id 去撈 EventsInfo 的資料:

Controller

首先修改瀏覽 Edit 的頁面,透過 Controller 接收到的 EventId 去撈取 Events 資料(其中包含對應的 EventsInfo 資料,已經寫在 Repository 了 )。
取得後,因為資料型別為 Events,需要將它轉換成 EventsEditViewModel,於是使用 AutoMapper 進行轉換,完成後丟到 Edit.cshtml

資料要 Post 到後端時,需要再將 EventsEditViewModel Mapping 到 Events,因為後端 Repository 以及 EF Core 是接收 Events 型別(我後來才發現 Scaffolding 出來的 Code 有 EventsExists() 這一個 Function,它是用來判斷 Events 有沒有真實存在於 DB):

本日結語

一開始寫完 Edit 的部分時,Post 到後端會出錯,看 Error Code 才發現 Edit.cshtml 忽略掉了 EventsInfoIdEventsInfoOfEventsId 這兩個欄位,看來得好好記住如果要異動兩個以上的資料表時, PK 和 FK 需要寫好。

明天繼續將刪除以及將 Model 的 DisplayAttribute 做好,那麼明天見了☺️


上一篇
ASP.NET Core - 活動報名管理系統:Day17 讓 View 顯示 Enum 的文字
下一篇
ASP.NET Core - 活動報名管理系統:Day19 將 CRUD 的前後端寫好 - 2
系列文
用 30 天和 ASP.NET Core 打造一個活動報名管理系統30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言