# Day11 View解講&路由 (CH7, CH10 路由) ###### tags: `MVC` ![](https://i.imgur.com/Xnjl86m.png) 以mvc的觀點, HTML Helper的好處就是透過model, 可以加速簡化 html的開發. ![](https://i.imgur.com/XtffPYR.png) 因為mvc有view, 所以才限制有viewData, viewModel, viewBag 這三種東西. 假設我都不要這些好處, 用標準的html也可以做到, 因為最後會渲染成HTML. ![](https://i.imgur.com/wB0So90.png) ### Model對view帶來的影響 在mvc的model設定了annotaion, 底下的事情就幫你做掉了. 做一次整個專案就生效. DRY(Don't Repeat Youself) 1.View前端資訊 2.View前端驗證 3.Action中的IsValid 4.Model透過EF變更資料欄位Schema設定 ![](https://i.imgur.com/zXN6FiP.png) ![](https://i.imgur.com/J3hNbUl.png) ### Editor() & EditorFor() > 一隻萬用key, 可以開一百個房間 只會受到兩個部份的影響, 第一個是資料屬性, 第二個是dataAnnotation. ![](https://i.imgur.com/Ii2lc6R.png) ![](https://i.imgur.com/od5DR62.png) > c#怎麼去呼叫網路json的資料, 在做資料模型的細節到viewModel? ### 驗證 驗證有分成前端和後端. #### 前端 瀏覽器就把資料驗證完, 但是要怎麼證明? 如果CREATE按下去, NETWORK沒有反應, 這就是前端. 因為有綁定底下的validation. ```csharp= @section Scripts { @Scripts.Render("~/bundles/jqueryval") } ``` #### 後端 如果把上述的script註解, NETWORK會跑出資料, 這樣就是後端. 那為什麼會阻擋成功呢? 因為 ```csharp= // 可以在create中的action找到這一段. if (ModelState.IsValid) { db.Users.Add(user); db.SaveChanges(); return RedirectToAction("Index"); } //輸入這一行, 可以跑出相對的錯誤訊息. ModelState.AddModelError("city", "城市必須輸入"); // 有這一行是因為要把你輸入的東西再彈回去, 彈回去代表你輸入的都還在 // 這是透過ssr的render. return View(user) ``` ### Create和Edit表單的差異 編輯要透過特定的id來編輯, 但是scaffolding是沒有特定id的 `@Hidden for`主要會出現在edit的view裡面. 因為通常在create的時候是不指定id的, 都是動態產生, 除非一開始就要讓新增的使用者產生指派的id. 如果要做超連結, htmlhelper做不出來, 可以直接用原生的來產生超連結 ### ValidationSummary true改成false, 同樣的也可以改放在下面, 但我覺得沒啥用 ### 小技巧 如果模型沒有加上驗證的話(DataAnnotation), 可以加上這一行 ```csharp= ModelState.AddModelError("city", "城市必須輸入") ``` 還可以不針對任何的欄位使用 ```csharp= ModelState.AddModelError("error", "輸錯了, 請重來!") ``` ### .html表單可以回傳給controller和action作互動嗎? 一般來說都是透過.cshtml拉. 這個東西能夠提交回去, 是因為包在form的, 要回去哪裡是哪一個屬性? 是form裡面的action. mvc必須塞action的值進去. 所以沒錯啊, 可以啊. 就像老師之前示範的 可以搜尋完後, 把值找出來, 那不就是用form表單去傳的. 不管甚麼技術到了瀏覽器就是html. 所以如果要用原生的和瀏覽器做搭配, 就用原生的思路就好了. 原本的寫法是要搭配伺服器的成本, 如果是原生的就只是吐資料罷了. 所以可以直接放進來 ```htmlmixed= @{ ~Layout } <form action="/Home/Create" method="post"> <label for="email"> <input type="text" id="email" name="email"/> </form> ```` 所有⽅法套⽤ Bootstrap,參數都是 ```csharp= new { @class ="..."}」 ``` 的型式, 唯⼀例外是 Editor ⽅法,參數是 ```csharp= 「new { htmlAttributes = new { @class = "form-control"}」 ``` 結構上略有不同,且不能省略 ### DataAnnotation 受到DataAnnotation的model會影響view和資料庫 ### 講解表格做法 具體也可以參考Practice -> day11 (Mvchelper), 主要練習在撰寫MVC的手工寫法. 如果需要可以在自己複習下就好了 > [Github](https://gist.github.com/apprunner/b0b9a7ddfba72ea225db6c02540282f9) ## 路由 快取的dataAnnotation =>`[OutPutCatch(Duration=60)]` 輸出的頁面就會快取60s, 不用每一次都從資料庫去抓資料. --- 補充刪除整個資料表, 並且不留下遺留的id. ```csharp= TRUNCATE TABLE MyTestTable ``` > https://byron0920.pixnet.net/blog/post/85759990