# Day11 View解講&路由 (CH7, CH10 路由)
###### tags: `MVC`

以mvc的觀點, HTML Helper的好處就是透過model, 可以加速簡化
html的開發.

因為mvc有view, 所以才限制有viewData, viewModel, viewBag
這三種東西. 假設我都不要這些好處, 用標準的html也可以做到, 因為最後會渲染成HTML.

### Model對view帶來的影響
在mvc的model設定了annotaion, 底下的事情就幫你做掉了.
做一次整個專案就生效.
DRY(Don't Repeat Youself)
1.View前端資訊
2.View前端驗證
3.Action中的IsValid
4.Model透過EF變更資料欄位Schema設定


### Editor() & EditorFor()
> 一隻萬用key, 可以開一百個房間
只會受到兩個部份的影響, 第一個是資料屬性, 第二個是dataAnnotation.


> 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