0%

【MVC教學】5.Controller簡介

Demo範例 : Git位置

前面幾篇解說了Route設定,讓我們的程式能順利找到對應的Controller來執行,那今天要來談談Controller幫我們做些什麼?
我們通常會在Controller這層就將使用者的參數驗證完畢,並且依據傳入的參數,找到對應的商業邏輯去執行,並且回傳結果給使用者知道,已註冊頁面作為實際應用來解說。

接著我們來實作上述的內容,但因為只是MVC初學,所以我們還不加入分層、資料庫溝通之類比較深的內容,只專注在Controller怎麼做。

 

建立Controller

 
我們先建立一個UserController,專門處理User相關的服務跟邏輯

接著寫一個SignUp的Action,這邊有看到我們掛HttpGet的Attribute,只是指定呼叫動詞必須是Get的方式才會執行到這個Action

如果不知道Http動詞的話可以參考 : HTTP請求方法

[![](https://1.bp.blogspot.com/-KA_M1a5AopU/WuCDeRZvUuI/AAAAAAAAIrI/C66BwZf0wvw7Z2PDngjof-IgAzSwUE3bwCEwYBhgL/s400/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7%2B2018-04-25%2B%25E4%25B8%258B%25E5%258D%25889.32.27.png)](https://1.bp.blogspot.com/-KA_M1a5AopU/WuCDeRZvUuI/AAAAAAAAIrI/C66BwZf0wvw7Z2PDngjof-IgAzSwUE3bwCEwYBhgL/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7%2B2018-04-25%2B%25E4%25B8%258B%25E5%258D%25889.32.27.png)

 

建立View

 
而這個Action沒有任何內容,只有回傳一個View而已,接著我們來實作出回傳的頁面,在這個Action中點擊右鍵 > 新增檢視




接著直接執行,應該就能看到我們剛剛做出來的SignUp頁面


而這邊網址是 /user/signup,我覺得不夠直覺,所以到RouteConfig改一下

接著把頁面簡單做起來



寫一個Action來接收傳過來的資料

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
[HttpPost]
public ActionResult SignUp(string account,string password)
{
bool Result = false;
//帳號密碼都不能為空值
if (!string.IsNullOrWhiteSpace(account) &&
!string.IsNullOrWhiteSpace(password))
{
//帳號必須要有@字元
//密碼必須大於六個字元
if (account.Contains("@") && password.Length > 6)
{
//我們判斷是否有註冊過的帳號,因為還沒有連結資料庫
//所以先假定steven@mymail.com被註冊過
if (account != "steven@mymail.com")
{
TempData["Message"] = "註冊成功!!";
Result = true;
}
else
{
TempData["Message"] = "帳號已經存在";
}
}
else
{
TempData["Message"] = "帳號密碼不符合格式";
}
}
else
{
TempData["Message"] = "帳號密碼不能為空值";
}

if (Result)
{
//註冊成功,導到首頁
return RedirectToAction("index", "home");
}
else
{
return RedirectToAction("signup", "user");
}
}

這邊注意到我們的Attribute就下了HttpPost,表示只有Post可以呼叫到這個Action,而我們在Form那邊也設定了方法用Post


接著你可能會注意到裡面有用到TempData,通常TempData是用來跨Action傳遞資料用的,底層其實是將資料存在Session之中,而且你只要取用過一次裡面的值就會被清掉。 而因為我們這個Action只是在處理註冊的相關邏輯,執行完後可以看到最後回傳的都是RedirectToAction,也就是導到我們指定的Action去回傳頁面,所以會跨兩個Action以上,存在TempData是個簡單的處理方式。

接著執行看看你會發現,好像一切有照著我們的邏輯在執行,但唯獨訊息不會顯示出來,因為我們雖然將TempData之中,卻沒有寫顯示訊息的那一段,通常這一段邏輯我們會放在共用的_Layout裡面。


因為還沒解說View的關係,這邊就先照著寫,之後會解說到。再次執行就會發現訊息會正確S顯示出來了。


上述的Controller撰寫方式,就是通常我們在Controller做的工作,驗證參數 、 依據使用者輸入的值執行對應的邏輯 、最後回傳結果。但你應該也會發現,整個Action邏輯裡面光是驗證參數就佔了大半的篇幅,這往往會讓程式碼複雜度提高,閱讀變得困難,這部分我們會在下一篇講解該如何把這類的邏輯分隔出去,讓程式碼更好維護美觀一些。另外Action其實還可以回傳很多種結果,前面範例用到了

View : 回傳頁面
RedirectToAction :回傳導頁結果

底層還支援了一些回傳方式,靈活應用就可以達成大部分的功能了。詳細參考: MSDN