先前我們導入了 Repository Pattern 以及將 Events 的瀏覽功能寫好了,為了讓整體功能更完整,今天就把新增、編輯以及讀取都寫好吧!
原本還是使用 DbContext 來儲存資料,現在改為透過 Repository:
雖說後端新增功能已經可以運作了,不過在前端輸入欄位的部分,還是可以調整得更好,e.g. SimpleInfo、FullInfo 使用 Textarea 會更好,PersonalSite 可以加入合法網址列的驗證:
運用 Tag Helper,將原本的 input
改成使用 textarea
,span
必須留下,因為它是用來顯示錯誤訊息的:
FullIntro 也一併修改。
修改的部分則要再新增一個 ViewModel,因為原本的 EventsCreateViewModel
包含著 CreateTime
與 CreateUser
,而修改時需要異動的則是 UpdateTime
與 UpdateUser
,所以必須要再建立一個 ViewModel:
Events
改成 EventsEditViewModel
CategoryId
改為 Enum 下拉選單。接下來將 EventsInfo
的欄位加上去,要特別注意,還要加上 EventsInfoofEventsId
與 EventsInfoId
,如此在 Model Binding 時才能綁定 PK, FK:
編輯的部分需要實作兩個 Function,分別是 UpdateEventAsync()
與 GetEventByIdAsync()
,原因是點擊進 Edit 頁面時,需要先到後端撈此活動資料,而送到後端則是修改資料表的內容:
UpdateEventAsync()
GetEvents()
一樣畫葫蘆,只不過這裡在做 Update,以及為了符合原本 Controller 就是使用非同步的 Function,所以在 Interface 也新增了非同步的 UpdateEventAsync()
Function,以及在 Repository 實作此 Function(但老實說我目前還不懂非同步程式的運作,專案完成到一個階段後來好好瞭解一下。):GetEventByIdAsync()
Event
資料,同時也要用 Events.Id
去撈 EventsInfo
的資料:
首先修改瀏覽 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
忽略掉了 EventsInfoId
與 EventsInfoOfEventsId
這兩個欄位,看來得好好記住如果要異動兩個以上的資料表時, PK 和 FK 需要寫好。
明天繼續將刪除以及將 Model 的 DisplayAttribute 做好,那麼明天見了☺️