1. 程式人生 > >ASP.NET MVC 重點教程一週年版 第九回 HtmlHelper

ASP.NET MVC 重點教程一週年版 第九回 HtmlHelper

許多時候我們會遇到如下場景

在寫一個編輯資料的頁面時,我們通常會寫如下程式碼

   1: <input type="text" value='<%=ViewData["title"] %>' name="title" />

由前篇我們所講的Helper演化,我們思考,對於這種程式碼我們是不是也可以用一個Helper來自動繫結資料呢

這當然是可以的,ASP.NET MVC提供了一個HtmlHelper用於生成有資料繫結的Html標籤。

1.ActionLink

其中最常用的就是Html.ActionLink

1.1基本的使用方式

   1:
<%=Html.ActionLink("這是一個連線", "Index", "Home")%>

在UrlRouting規則為預設規則的情況下,它生成的HTML程式碼為

   1: <a href="/">這是一個連線</a>

ActionLink中的三個引數分別為

  1. 顯示的文字
  2. Action
  3. Controller

其中Controller可以省略,省略時指向同一Controller下的Action。

1.2ActionLink中QueryString與Html屬性設定

   1: 帶有QueryString的寫法
   2: <%=Html.ActionLink("這是一個連線", "Index", "Home", new { page=1 },null)%>
   3: <%=Html.ActionLink("這是一個連線", "Index", new { page=1 })%>
   4: 有其它Html屬性的寫法
   5: <%=Html.ActionLink("這是一個連線", "Index", "Home", new { id="link1" })%>
   6: <%=Html.ActionLink("這是一個連線"
, "Index",null, new { id="link1" })%>
   7: QueryString與Html屬性同時存在
   8: <%=Html.ActionLink("這是一個連線", "Index", "Home", new { page = 1 }, new { id = "link1" })%>
   9: <%=Html.ActionLink("這是一個連線", "Index" , new { page = 1 }, new { id = "link1" })%>

其生成結果為:

   1: 帶有QueryString的寫法
   2: <a href="/?page=1">這是一個連線</a>
   3: <a href="/?page=1">這是一個連線</a>
   4: 有其它Html屬性的寫法
   5: <a href="/?Length=4" id="link1">這是一個連線</a>
   6: <a href="/" id="link1">這是一個連線</a>
   7: QueryString與Html屬性同時存在
   8: <a href="/?page=1" id="link1">這是一個連線</a>
   9: <a href="/?page=1" id="link1">這是一個連線</a>

這樣就可以使用ActionLink生成近乎所有的地址連線了。

注意,如果連線中不涉及到action及controller就沒有必要使用ActionLink,而是直接寫HTML程式碼就可以了,例如

   1: <a href="#1">一章</a>
   2: <a href="javascript:void(0)" onclick="delete();">刪除</a>

2.RouteLink

2.1與ActionLink

RouteLink與ActionLink相差無幾,只是它的地址是由Route生成拿上面的例子

   1: <%=Html.ActionLink("這是一個連線", "Index", "Home")%>

來說,如果用RouteLink來寫就是

   1: <%=Html.RouteLink("這是一個連線", new { controller="Home",action="Index"})%>

而帶上QueryString以及Html屬性的ActionLink

   1: <%=Html.ActionLink("這是一個連線", "Index" , new { page = 1 }, new { id = "link1" })%>

就可以這樣來寫

   1: <%=Html.RouteLink("這是一個連線", new { action = "index", page = 1 }, new { id="link1"})%>

其實就是用一個新建立的RouteValueDictionary的物件(new{}所例項化的物件將會等價轉換為RouteValueDictionary)來替原來的Action,Controller字串的單獨指定。

2.2RouteLink使用Route規則

除了這些協同的用法,RouteLink還支援使用Route規則名來建立連線

例如我們在Global.asax檔案中新增一個Route規則

   1: routes.MapRoute(
   2:     "about",//這是規則名
   3:     "about",//url
   4:     new {controller = "Home", action = "about"}
   5:     );

那麼我們就可以使用這個Route規則

   1: <%=Html.RouteLink("關於", "about", new { })%>
   2: <%=Html.RouteLink("關於", "about", new { page = 1 })%>
   3: <%=Html.RouteLink("關於", "about", new { page = 1 }, new { id = "link1" })%>

來生成如下的HTML:

   1: <a href="/about">關於</a>
   2: <a href="/about?page=1">關於</a>
   3: <a href="/about?page=1" id="link1">關於</a>

3.表單

很多情況下是要生成表單元素的,正如文章開始所述,修改一個內容的情況下,我們可能要將資料與表單繫結。

3.1生成Form

我們當然可以使用純的Html程式碼或UrlHelper來生成一個Form。

   1: <form action="/home/index" method="post">
   2: </form>
   1: <form action="<%=Url.Action("Index","Home")%>" method="post">
   2: </form>

但是因為是在HTML的屬性中,所以還是難以維護,幸好ASP.NET MVC為我們提供了一個Helper,我們可以通過以下兩種方式生成一個Form:

   1: <%using(Html.BeginForm("index","home",FormMethod.Post)){%>
   2: 表單內容
   3: <%} %>
   4: <%Html.BeginForm("index", "home", FormMethod.Post);//注意這裡沒有=輸出%>
   5: 表單內容
   6: <%Html.EndForm(); %>

BeginForm方法類似於ActionLink的呼叫方式,所以ASP.NET MVC還提供了BeginRouteForm這種方法。

當然這裡我們也可以使用new{}來為form的action增加querystring或HTML屬性,方法與前面介紹的大同小異,參見方法列表即可。

3.2表單元素

ASP.NET MVC提供了多種表單元素的Helper。

其中包括:TextBox(類似input type=text,下面類似)、TextArea、DropDownList(select)、CheckBoxHidden、ListBox、Password、RadionButton。

注意:因為<input type=”submit” />一般情況下是不會繫結資料的所以ASP.NET MVC並未提供此Helper(曾經提供過在preview2之前)

如果我們想提供一個input type=text 它的name為t1則以下程式碼:

   1: <%=Html.TextBox("t1") %>

3.3表單元素繫結

如果我們想要讓上文中的t1初始時就有一個值,比如 “重典”那麼我們可以按以下方式

   1: <%=Html.TextBox("t1","重典") %>

如果資料是從資料庫中讀取,即得到資料是從Action中獲取的,那麼我們可以在Action中使用ViewData傳遞

Action:

   1: ViewData["name"]="重典";

View:

   1: <%=Html.TextBox("t1",ViewData["name"]) %>

以上方法看似簡單,其實ASP.NET MVC為我們提供了更為簡便的繫結方式---只要保證ViewData的Key與Helper所生成元素的name保持一致就可以自動繫結:

Action:

   1: ViewData["t1"]="重典";

View:

   1: <%=Html.TextBox("t1") %>

這樣就可以自動綁定了

3.4列表資料顯示與繫結

像TextBox這種值單一的資料比較容易,但是存在的資料比較多的DropDownList或ListBox應該怎麼繫結資料及初始化值呢,我們來看看下面的例子:

Action:

   1: ViewData["sel1"] = new SelectList(
   2:     new[] {1, 2, 3} /*列表內容可以是陣列*/
   3:     , 3 /*預設值,可以是從資料庫讀出的*/
   4:     );

View:

   1: <%=Html.DropDownList("sel1")%>

這樣就可以將列表內容、預設值、以及表單元素三者繫結在一起了。

而我們的列表內容並不是任何情況下都是陣列的,大多情況下還是Key-Value對居多。

我們可以使用以下方式:

   1: List<SelectListItem> list = new List<SelectListItem>
   2:                               {
   3:                                   new SelectListItem {Text = "重典", Value = "1"},
   4:                                   new SelectListItem {Text = "鄒健", Value = "2"},
   5:                               };
   6: ViewData["sel1"] = new SelectList(
   7:     list /*列表內容可以是陣列*/
   8:     , "2" /*預設值,可以是從資料庫讀出的*/
   9:     );