demoshop

demo, trying to be the best_

今天聽從老闆的話從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

  1. <%= Html.ActionLink("test""Details",new { id = 2 })%> 
  2.   //產生的連結 http://xxx/home/Details/2 
  3.   //直接死因為他找不到home/Deatils 
  4.   //因為依據MapRoute的解釋網址格式必須是action/xxx才會使用test的controller並且呼叫Details動作 
  5.   <a href="/action/87">YYYYYYY</a> 
  6.   //產生的連結 http://xxx/action/87 
  7.   //也接不到值,因為依據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內


而下面這是官方的資料,這很重要

  1. ViewResult – Represents HTML and markup.
  2. EmptyResult – Represents no result.
  3. RedirectResult – Represents a redirection to a new URL.
  4. RedirectToRouteResult – Represents a redirection to a new controller action.
  5. JsonResult – Represents a JavaScript Object Notation result that can be used in an AJAX application.
  6. ContentResult – Represents a text result.

 

  1. View – Returns a ViewResult action result.
  2. Redirect – Returns a RedirectResult action result.
  3. RedirectToAction – Returns a RedirectToRouteResult action result.
  4. RedirectToRoute – Returns a RedirectToRouteResult action result.
  5. Json – Returns a JsonResult action result.
  6. Content – Returns a ContentResult action result.

以上就是今天的筆記,MVC到目前為止demo還有很多問題沒看到答案,明天繼續把Tutorials給K完吧

回應討論