表單中的action與method特性。Action表示表單要提交往那裏,所以這裏就有一個URL。這個URL能夠是相對或絕對地址。表單默認的method屬性值是get,若是看到表單沒有寫method屬性那就是表示method是get方式提交。另一種就是post方式。html
當使用HTTP Get請求時,瀏覽器會提取表單中元素的name特性值及相應的value特性值放到查詢字符串中。如:http://localhost?search?id=1數據庫
若是不想把值放到查詢字符串中,放到HTTP請求的主體中,就應該使用post方式。c#
一般狀況下get方式用於讀操做(查詢),post方式用於寫操做(更新、建立、刪除)。瀏覽器
建立示例:框架
//查詢界面查詢函數
@using (Html.BeginForm("Search", "Home",FormMethod.Get)) { <input type="text" name="q" /> <input type="submit" value="search" /> }
//相應的控制器中的action處理Http Get獲得的數據,返回查詢結果視圖post
public ActionResult Search(string q) { var db = new MusicStoreDB(); var alblums = db.albums.Include("Artist") .Where(a => a.Title.Contains(q)).Take(10); ViewBag.Message = "Search"; return View(alblums); }
//視圖顯示查詢結果性能
@model IEnumerable<LYG.HelloWorld.Models.Album> @{ ViewBag.Title = "Search"; } <h2>Result</h2> <table> <tr> <th>Artist</th> <th>Title</th> <th>Price</th> </tr> @foreach(var item in Model) { <tr> <td>@item.Artist.Name</td> <td>@item.Title</td> <td>@string.Format("{0:c}",item.Price)</td> </tr> } </table>
@using (Html.BeginForm("Search", " Home", FormMethod.Get)) { <input type="text" name="q" /> <input type="submit" name="Search" /> }
等效的html:網站
<form action="/Home/Search" method="get">spa
設置元素的class特性就要求匿名類型對象上必須有一個名爲class的屬性,或者值的字典中有一個名爲class的鍵。在字典中有一個「class」的鍵值不是問題,問題在於對象中帶有一個名爲class的屬性。由於class是c#語言的保留關鍵字,不能用做屬性名稱或標識符,因此必須在class前面加一個@符號做爲前綴:
@using (Html.BeginForm("Search", "Home", FormMethod.Get, new {target = "_blank", @class="editForm"}))
另外一個問題是將屬性設置爲帶有連字符的名稱(如data-val)。帶有連字符的C#屬性名是無效的,但全部的HTML輔助方法在渲染HTML時會將屬性名中的下劃線轉換爲連字符。
@using (Html.BeginForm("Search", "Home", FormMethod.Get, new {target = "_blank",@class="editForm", data_validatable=true}))
等效的HTML爲:
<form action="/Home/Search" class="editForm" data-validatable="true"
method="get" target="_blank">
@Html.ValidationSummary(true)
用來顯示ModelState字典中全部驗證錯誤的無序列表。使用布爾類型參數(值爲true)來告知輔助方法排除屬性級別的錯誤,而不顯示那些具體模型屬性相關的錯誤
@Html.TextBox("Title",Model.Title)
渲染一個type特性爲text的input標籤,用於接收用戶自由形式的輸入,等效的HTML:
<input id="Title" name="Title" type="text" value="For those about to Rock We Salute You" />
@Html.TextArea("text","hello <br/> world")
等效HTML:
<textarea cols="80" id="text" name="text" rows="10">hello <br /> world </textarea>
@Html.LabelFor(p=>p.GenereId)
等效HTML:
<label for ="GenreId">Genre</label>
返回一個<label/>元素,並使用String類型的參數來決定渲染的文本和for特性值
DropDownList容許進行單項選擇,而ListBox支持多項選擇(在要渲染的標記中,把multiple特性的值設置爲multiple)
一般,select元素有兩個做用:
展現可選項的列表
展現字段的當前值
下拉列表須要包含全部可選項的SelectListItem對象集合,其中每個SelectListItem對象又包含有Text、Value和Selected三個屬性。能夠根據須要構建本身的SelectListItem對象集合,也可使用框架中的SelectList或者MultiSelectList輔助方法類來構建。這些類能夠查看任意類型的Ienumerable對象並將其轉換爲SelectListItem對象的序列。
例如,StoreManager控制器中的Edit操做:
public ActionResult Edit(int id) { var album = storeDB.Albums.Single(a => a.AlbumId == id); ViewBag.Genres = new SelectList(storeDB.Genres.OrderBy(g => g.Name), "GenreId","Name",album.GenreId); return View(album); }
這裏控制器操做不只構建了主要模型(用於編輯的模型),還構建了下拉列表輔助方法所須要的表示模型。SelectList構造函數的參數指定了原始集合(數據庫中的Genres表)、做爲後臺值使用屬性名稱(Name)以及當前所選項的值(他決定將哪一項標記爲選擇項)。
若是想在避免反射開銷的同時還想本身生成SelectListItem集合,可使用LINQ的Select方法來將SelectListItem對象集放入項目Genres:
var album = MusicStoreDB.Genres .OrderBy(g => g.Name) .AsEnumerable() .Select(g => new SelectListItem { Text = g.Name, Value = g.GenreId.ToString(), Selected = album.GenreId == g.GenreId }); return View(album);
@Html.ValidationMessage("Title")
等效HTML:
<span class="field-validation-error" data-valmsg-for="Title" data-valmsg-replace="true">
What a terrible name!
</span>
當ModelState字典中的某一特定字段出現錯誤時,可使用ValidationMessage輔助方法來顯示相應的錯誤提示消息。
@Html.Hidden("WizardStep","1")
方法用於渲染隱藏的輸入元素,等效HTML:
<input id="wizardStep" name="wizardStep" type="hidden" value="1" />
強類型方法是Html.HiddenFor。若是模型有一個WizardStep屬性,就能夠這樣使用:
@Html.HiddenFor(m => m.WizardStep)
@Html.Password("UserPassword")
方法用於渲染密碼字段。它除了不保留提交值,顯示密碼掩碼以外,基本與TextBox輔助方法同樣。
等效HTML:
<input id="UserPassword" name="UserPassword" type="password" value="">
Html.Password的強類型方法是Html.PasswordFor。下面的代碼展現如何使用它來顯示UserPassword屬性:
@Html.PasswordFor(m => m.UserPassword)
@Html.RadioButton("color","red")
單選按鈕通常都組合一塊兒使用,爲用戶的單項選擇提供一組可選項。
等效的HTML:
<input id="color" name="color" type="radio" value="red" />
Html.RadioButton有一個強類型的對應方法Html.RadioButtonFor。強類型方法不使用名稱和值,而是用表達式來標識那些包含有要渲染屬性的對象,當用戶選擇單選按鈕時,後面會跟要提交的值:
@Html.RadioButtonFor(m => m.GenreId, "1") Rock
@Html.CheckBox("IsDiscounted")
方法是惟一一個渲染兩個輸入元素的輔助方法,等效HTML:
<input id="IsDiscounted" name="IsDiscounted" type="checkbox" value="true" />
<input name="IsDiscounted" type="hidden" value="false" />
輔助方法、模型和視圖數據:
輔助方法如Html.TextBox和Html.DropDownList(以及其餘全部表單輔助方法)檢查ViewData對象以得到要顯示的當前值(在ViewBag對象中的全部值也能夠經過ViewData獲得)。
(1)若是想在一個表單中設置專輯的價格,可以使用下面的控制器代碼
public ActionResult Edit(int id) { ViewBag.Price = 10.0; return View(); }
在相應的視圖中,使用ViewBag中的值來爲TextBox輔助方法命名,能夠實現渲染顯示價格的文本框:
@Html.TextBox("Price")
TextBox輔助方法將生成以下所示的HTML標記:
<input id="Price" name="Price" type="text" value="10" />
(2)當輔助方法查看ViewData裏面的內容時,他們也能看到其中的對象屬性。修改先前的控制器操做:
public ActionResult Edit(int id) { ViewBag.Album = new Album {Price = 11}; return View(); }
在響應的視圖中,可使用下面這行代碼來顯示一個帶有專輯價格的文本框:
@Html.TextBox("Album.Price")
如今渲染出的HTML標記以下所示:
<input id="Album_Price" name="Album.Price" type="text" value="11" />
若是在ViewData中沒有匹配「Album.Price」的值,那麼輔助方法將嘗試查找與第一個點以前那部分名稱(Album)匹配的值。換言之,就是找一個Album類型的對象。而後,輔助方法估測名稱中剩餘的部分(Price),並找到相應的值。
注意渲染獲得的input元素的id特性值使用下劃線代替了點(但name特性依然使用點)。
(3)TextBox輔助方法依靠強類型視圖數據也能很好的工做。
public ActionResult Edit(int id) { var album = new Album {Price = 12.0m}; return View(album); }
視圖中的代碼:
@Html.TextBox("Price");
對應的HTML標記:
<input id="Price" name="Price" type="text" value="12.0" />
(4)若是想避免自動的查找數據,可向表單輔助方法提供一個顯式的值。有時,顯式提供值的方法是必須的。返回到剛纔正在構建(用來編輯專輯信息)的表單。
控制器代碼:
public ActionResult Edit(int id) { var album = storeDB.Albums.Single(a => a.AlbumId == id); ViewBag.Genres = new SelectList(storeDB.Genres.OrderBy(g => g.Name) , "GenreId" , "Name" , album.GenreId); return View(album); }
視圖:
@Html.TextBox("Title", Model.Title)
強類型的輔助方法
若是不適應使用字符串字面值從視圖數據中提取值的話,也可使用MVC提供的各類強類型輔助方法。使用強類型輔助方法時,只須要爲其傳遞一個lambda表達式來指定要渲染的模型屬性。表達式的模型類型必須和爲視圖指定的模型類型(使用@model指令)一致。對於專輯模型的強類型視圖,須要在視圖頂部輸入以下所示的代碼:
@model MvcMusicStore.Models.Album
一旦添加模型指令,就可使用下面的代碼重寫前面的專輯編輯表單:
@using (Html.BeginForm()) { @Html.ValidationSummary(excludePropertyErrors: true) <fieldset> <legend>Edit Album</legend> <p> @Html.LabelFor(m => m.GenreId) @Html.DropDownListFor(m => m.GenreId, ViewBag.Genres SelectList) </p> <p> @Html.TextBoxFor(m => m.Title) @Html.ValidationMessageFor(m => m.Title) </p> <input type="submit" name="Save"> </fieldset>> }
注意:
這些強類型的輔助方法名稱除了有"For"後綴以外,跟先前使用的輔助方法還有相同的名稱。儘管該代碼生成了與先前代碼一樣的HTML標記,可是用lambda表達式代替字符串還有許多其餘好處,其中包括智能感知、編譯時檢查和輕鬆的代碼重構。
這裏不須要顯式的爲Title文本框設置值,這主要是由於lambda表達式向輔助方法提供了足夠的信息,使其能直接讀取模型的Title屬性來獲取須要的值。
模版輔助方法
ASP.NET MVC中的模版輔助方法利用元數據和模版構建HTML。其中元數據包括關於模型值(它的名稱和類型)的信息和(經過數據註解或自定義提供器添加的)模型元數據
。模型輔助方法有Html.Display和Html.Editor,以及分別與他們對應的強類型方法Html.DisplayFor和Html.EditorFor,還有它們對應的完整模型Html.DisplayForModel和Html.EditorForModel。
@Html.TextBox("Title",Model.Title)
等同於:
@Html.EditorFor(m => m.Title)
二者生成的HTML標記是相同的,,可是EditorFor方法能夠經過使用數據註解來改變生成的HTML
渲染輔助方法
ActionLink輔助方法能渲染一個超連接(錨標籤),渲染的連接指向另外一個控制器操做,與前面看到的BeginForm輔助方法同樣,ActionLink輔助方法在後臺使用路由API來生成URL。
當連接的操做所在控制器與用來渲染當前視圖的控制器同樣時,只須要指定操做的名稱:
@Html.ActionLink("Link Text", "AnotherAction")
這裏假設採用默認路由,那麼執行這段代碼將生成以下所示的HTML標記:
<a href = "/Home/AnotherAction">LinkText</a>
當須要一個指向不一樣控制器操做的連接時,可經過ActionLink方法的第三個參數來指定控制器名稱。例如要連接到ShoppingCartController控制器的Index操做,可使用下面的代碼:
@Html.ActionLink("Link Text", "Index", "ShoppingCart")
URL輔助方法與HTML的ActionLink和RouteLink輔助方法相似,但它不是以HTML標記的形式返回構建的URL,而是以字符串的形式返回這些URL。對此,有三個輔助方法:
Action
Content
RouteUrl
Action輔助方法與ActionLink很是相似,可是它不返回錨標籤。例如,下面的代碼會顯示瀏覽商店裏全部Jazz專輯的URL(不是連接):
<span> @Url.Action("Browse", "Store", new {genre = "Jazz"}, null) </span>
將會生成以下所示的HTML標記:
<span>
/Store/Browse?genre=Jazz
</span>
Partial輔助方法用於將部分視圖渲染成字符串,以下將渲染一個名爲AlbumDisplay的部分視圖
@Html.Partial("AlbumDisplay")
RenderPartial輔助方法與Partial很是類似,但RenderPartial不是返回字符串,而是直接寫入響應輸出流。基於這個緣由,必須將RenderPartial放入代碼塊中,而不能放在代碼表達式。
@{Html.RenderPartial("AlbumDisplay"); } 或 @Html.Partial("AlbumDisplay")
通常狀況下,由於Partial相對於RenderPartial來講更方便(沒必要使用花括號將調用封裝在代碼塊中),因此選擇Partial。然而,RenderPartial擁有較好的性能,由於它是直接寫入響應流的,但這種性能優點須要大量的使用(高的網站流量或在循環中重複調用)才能看出來。
Action和RenderAction之間僅有的不一樣之處在於:RenderAction能夠直接寫入響應流。