ASP.NET MVC架構初體驗筆記(二)
- 2008-12-26
- 30033
- 0
今天聽從老闆的話從Tutorials來看點基本的東西,經由昨天的影片洗禮後現在來看code還滿好上手的,今天看了一半來紀錄一下吧。
網址在這http://www.asp.net/learn/mvc/,範例相當的好,因為每個單元都擁有VB和C#的Code讓你更沒有藉口說看不懂(昨天介紹的影片示範是VB)。
目前demo看到第五篇卡住了一下,因為此篇再解說MVC的URL Routing這是一個很重要的機制,也是一個很好用的東西,demo因為覺得他很重要所以特別花時間研究一下以下就是紀錄。
情境一
我們在Global.asax頁面建立一個網址規則
routes.MapRoute("blog", "action/{id}", new { controller = "test", action = "Details", id= "" });
然後在 index.aspx寫了兩個連結,一個使用HTML helpers一個使用HTML組字串的
<%= Html.ActionLink("test", "Details",new { id = 2 })%> <a href="/action/87">YYYYYYY</a>
然後我們把滑鼠一過去可以看到程式自動產生的網址是
http://xxx/action/2
http://xxx/action/87
然後再來看看testController.cs裡面我們使用id或直接定個變數ida的結果
public ActionResult Details(int? id)正確接值
public ActionResult Details(int? ida)接不到值
情境二
Global.asax
routes.MapRoute("blog", "action/{idb}", new { controller = "test", action = "Details", id= "" });
testController.cs
public ActionResult Details(int? id)
index.aspx
- <%= Html.ActionLink("test", "Details",new { id = 2 })%>
- //產生的連結 http://xxx/home/Details/2
- //直接死因為他找不到home/Deatils
- //因為依據MapRoute的解釋網址格式必須是action/xxx才會使用test的controller並且呼叫Details動作
- <a href="/action/87">YYYYYYY</a>
- //產生的連結 http://xxx/action/87
- //也接不到值,因為依據MapRoute的解釋action/後接的值應該叫做idb而我們在controller是使用id接值
<%= Html.ActionLink("test", "Details",new { id = 2 })%> //產生的連結 http://xxx/home/Details/2 //直接死因為他找不到home/Deatils //因為依據MapRoute的解釋網址格式必須是action/xxx才會使用test的controller並且呼叫Details動作 <a href="/action/87">YYYYYYY</a> //產生的連結 http://xxx/action/87 //也接不到值,因為依據MapRoute的解釋action/後接的值應該叫做idb而我們在controller是使用id接值 //因此我們來把MapRoute的改變一下 routes.MapRoute("blog", "action/{idb}", new { controller = "test", action = "Details", idb = "" }); //這時候 <%= Html.ActionLink("test", "Details",new { id = 2 })%> //產生的連結 http://xxx/action?id=2 //正確抓到值 //根據MapRoute解釋idb我們帶出去的參數名稱,但在controller中使用id接值所以會自動幫我們轉換成?id <a href="/action/87">YYYYYYY</a> //產生的連結 http://xxx/action/87 //接不到值 //因為依據MapRoute的解釋action/後接的值應該叫做idb而我們在controller是使用id接值,並且因為是直接寫HTML TAG所以沒有HTML Helppers無法幫我們轉換 //那如果我們把new的參數改成 <%= Html.ActionLink("test", "Details",new { idb = 2 })%> //產生的連結 http://xxx/action/2 //你覺得接的到嗎? //答案當然是否定的,在testController的Details傳入的參數名稱是id所以當然idb一定接不到
所以我們可以得到一個規則
- 當MapRoute的網址規則與new出來的參數一樣時HTML Helpers會自動判定所呼叫的ActionController接值的變數名稱
- 當使用HTML Helpers你new什麼參數出來,就換傳遞什麼名稱的參數出去,如果符合MapRoute就會縮寫,並不會用?id=傳出去
結論就是我們要把MapRoute拆開來看
routes.MapRoute("blog",//名稱 "action/{idb}",//參數 new { controller = "test", action = "Details", idb = "" });//參數的預設值
你可以直接把參數想成自己寫HTML TAG的規則如上{idb}傳出去的名稱就是叫做idb, 參數預設值可以想成使用HTML Helpers的規則,因此當建立MapRoute的時候參數的名稱當然要讓它和預設值的參數名稱一樣,這樣我們才可以享受HTML Helpers的優勢。
以下的是今天的筆記
- 建立Controller類別的時候要保持XXXcontroller命名方式,沒有controller字串 編譯器將不認識這是一個控制類別
- Global中的網址規則為{controller}/{Action}/{id}那帶入的就必須符合,比如說id就要new 一個出來,如改用{gid}那就必須要new 一個gid不然為無法辨識new{gid=my.id},會改成用參數丟出來。
- 使用連結的時候以下兩個是相通的
- <a href="/Home/Complete/<%= task.id.ToString() %>">Complete</a>
- <%= Html.ActionLink("完成","Complete",new {id=task.id} )%>--這個叫做HTML helpers
- 當你在controller有使用 return view()的時候就必須要實做該.aspx頁面在相對應的views內
而下面這是官方的資料,這很重要
- ViewResult – Represents HTML and markup.
- EmptyResult – Represents no result.
- RedirectResult – Represents a redirection to a new URL.
- RedirectToRouteResult – Represents a redirection to a new controller action.
- JsonResult – Represents a JavaScript Object Notation result that can be used in an AJAX application.
- ContentResult – Represents a text result.
- View – Returns a ViewResult action result.
- Redirect – Returns a RedirectResult action result.
- RedirectToAction – Returns a RedirectToRouteResult action result.
- RedirectToRoute – Returns a RedirectToRouteResult action result.
- Json – Returns a JsonResult action result.
- Content – Returns a ContentResult action result.
以上就是今天的筆記,MVC到目前為止demo還有很多問題沒看到答案,明天繼續把Tutorials給K完吧
回應討論