表單的使用
Action和Method特性
Action特性用以告知瀏覽器信息發(fā)往何處,因此,Action特性后面需要包含一個(gè)Url地址。這里的Url地址可以是相對(duì)的,也可以是絕對(duì)的。如下Form標(biāo)簽向Bing的search頁(yè)面發(fā)送一個(gè)搜索詞(輸入元素的名稱(chēng)為q)。
<form action="http://www.bing.com/search"> <input name="q" type="text" /> <input type="submit" value="search" /> </form>
Method特性可以告知瀏覽器使用HTTP POST還是使用HTTP GET,默認(rèn)情況下表單發(fā)送的是HTTP GET請(qǐng)求。下面,我們分別介紹GET方法和POST方法。
GET方法 - 從指定的資源請(qǐng)求數(shù)據(jù)
GET請(qǐng)求可被緩存
GET請(qǐng)求保留在瀏覽器歷史記錄中
GET請(qǐng)求可被收藏為書(shū)簽
GET請(qǐng)求不應(yīng)在處理敏感數(shù)據(jù)時(shí)使用
GET請(qǐng)求有長(zhǎng)度限制
GET請(qǐng)求只應(yīng)當(dāng)用于取回?cái)?shù)據(jù)
POST方法 - 向指定的資源提交要被處理的數(shù)據(jù)
POST請(qǐng)求不會(huì)被緩存
POST請(qǐng)求不會(huì)保留在瀏覽器歷史記錄中
POST不能被收藏為書(shū)簽
POST請(qǐng)求對(duì)數(shù)據(jù)長(zhǎng)度沒(méi)有要求
以下是對(duì)HTTP GET和HTTP POST的比較:
區(qū)別項(xiàng) | GET | POST |
---|---|---|
后退按鈕/刷新 | 無(wú)害 | 數(shù)據(jù)會(huì)被重新提交(瀏覽器應(yīng)該告訴用戶數(shù)據(jù)會(huì)被重新提交) |
書(shū)簽 | 可收藏為書(shū)簽 | 不可收藏為書(shū)簽 |
緩存 | 能被緩存 | 不能緩存 |
編碼類(lèi)型 | application/x-www-form-urlencoded | application/x-www-form-urlencoded或multipart/form-data。為二進(jìn)制數(shù)據(jù)使用多重編碼 |
歷史 | 參數(shù)保留在瀏覽器歷史中 | 參數(shù)不會(huì)保存在瀏覽器歷史中 |
對(duì)數(shù)據(jù)長(zhǎng)度的限制 | 限制,當(dāng)發(fā)送數(shù)據(jù)時(shí),GET方法想U(xiǎn)RL添加數(shù)據(jù);URL的長(zhǎng)度是受限制的(最長(zhǎng)2048個(gè)字符) | 無(wú)限制 |
對(duì)數(shù)據(jù)類(lèi)型的限制 | 只允許ASCII字符 | 沒(méi)有限制,也允許二進(jìn)制數(shù)據(jù) |
安全性 | 于 POST相比,GET安全性較差,因?yàn)閿?shù)據(jù)時(shí)暴露在URL當(dāng)中的 | 更安全,因?yàn)閰?shù)不會(huì)被保存在瀏覽器歷史或Web服務(wù)器日志當(dāng)中 |
可見(jiàn)性 | 在URL中對(duì)所有人可見(jiàn) | 數(shù)據(jù)不會(huì)顯示在URL當(dāng)中 |
表單的使用
下面,我們使用表單來(lái)構(gòu)建一個(gè)查詢產(chǎn)品的示例:
向上一篇《ASP.NET MVC5(二):控制器、視圖與模型》模型一節(jié)中的示例添加5種產(chǎn)品
修改ProductsController,添加Search和Result方法:
public ActionResult Search() { return View(); } public ActionResult Result(string productName) { var products = db.Products.Where(a => a.ProductName == productName); return View(products); }
并添加相應(yīng)的視圖,代碼如下
Search.cshtml(空模板):注意:這里我們使用了Form表單
@{ ViewBag.Title = "Search"; } <h2>Search</h2>@using (Html.BeginForm("Result", "Products", FormMethod.Get)) { <input type="text" name="productName" class="form-control" /> <br /> <input type="submit" value="search" class="btn btn-default" /> }
Result.cshtml(List模板):
@model IEnumerable<MyFirstMvcProject.Models.Product>@{ ViewBag.Title = "Result"; }<h2>Result</h2><p> @Html.ActionLink("Create New", "Create")</p><table class="table"> <tr> <th> @Html.DisplayNameFor(model => model.ProductName) </th> <th> @Html.DisplayNameFor(model => model.Description) </th> <th> @Html.DisplayNameFor(model => model.Price) </th> <th></th> </tr>@foreach (var item in Model) { <tr> <td> @Html.DisplayFor(modelItem => item.ProductName) </td> <td> @Html.DisplayFor(modelItem => item.Description) </td> <td> @Html.DisplayFor(modelItem => item.Price) </td> <td> @Html.ActionLink("Edit", "Edit", new { id=item.Id }) | @Html.ActionLink("Details", "Details", new { id=item.Id }) | @Html.ActionLink("Delete", "Delete", new { id=item.Id }) </td> </tr>}</table>
啟動(dòng)項(xiàng)目,將URL定位到/Products/Search,效果如下:
在文本框中輸入MateBookX,點(diǎn)擊search按鈕,得到查詢結(jié)果。
通過(guò)以上示例,我們已經(jīng)成功的使用表單實(shí)現(xiàn)了一個(gè)產(chǎn)品查詢的功能。
HTML輔助方法
上一節(jié)中,已經(jīng)涉及到Html.BeginForm輔助方法的使用,使用輔助方法的目的很明確,就是使視圖編碼變得更容易。
輔助方法簡(jiǎn)介
每一個(gè)Razor視圖都繼承了它們基類(lèi)的Html屬性,Html屬性的類(lèi)型是System.Web.Mvc.HtmlHelper<T>,這里的T是一個(gè)泛型類(lèi)型的參數(shù),代表傳遞給視圖的模型類(lèi)型。這個(gè)屬性提供了一些實(shí)例方法,然而,如BeginForm等大多數(shù)輔助方法都是通過(guò)擴(kuò)展方法實(shí)現(xiàn)的,ASP.NET MVC所有的HtmlHelper擴(kuò)展方法都在命名空間System.Web.Mvc.Html中。
在智能感知窗口中,左邊有個(gè)向下箭頭就說(shuō)明這個(gè)方法是一個(gè)擴(kuò)展方法。
下面,我們將介紹一些常用的輔助方法:
Html.TextBox
TextBox輔助方法渲染一個(gè)type特性為text的input標(biāo)簽。
調(diào)用方法:@Html.TextBox("Title","This is Value")
生成HTML標(biāo)記:<input id="Title" name="Title" type="text" value="This is Value" />Html.TextArea
TextArea渲染一個(gè)能夠顯示多行文本的<textarea>元素。
調(diào)用方法:@Html.TextArea("text","Hello ! This is Text Area !")
生成HTML標(biāo)記:<textarea cols="20" id="text" name="text" rows="2"> Hello ! This is Text Area !</textarea>Html.Label
Label輔助方法返回一個(gè)<label/>元素,并使用String類(lèi)型的參數(shù)來(lái)決定渲染的文本。
調(diào)用方法:@Html.Label("Name")
生成HTML標(biāo)記:<label for="Name">Name</label>
NameHtml.DropDownList和Html.ListBox
DropDownList和ListBox輔助方法都返回一個(gè)<select/>元素。DropDownList允許進(jìn)行單項(xiàng)選擇,而ListBox支持多項(xiàng)選擇。修改ProductsController中的Search方法public ActionResult Search() { var products = db.Products.Single(a => a.ProductName == "Apple Pencil"); ViewBag.Products = new SelectList(db.Products.OrderBy(g => g.Price), "Id", "ProductName", products.Id); return View(); }
并在相應(yīng)的View中添加輔助方法DropDownList,效果如下:
@Html.DropDownList("Products", String.Empty)
Html.ValidationMessage
當(dāng)ModelState字典中的某一特定字段出現(xiàn)錯(cuò)誤時(shí),可以使用ValidationMessage輔助方法來(lái)顯示相應(yīng)的錯(cuò)誤提示信息。修改ProductsController中的Search方法public ActionResult Search() { var products = db.Products.Single(a => a.ProductName == "Apple Pencil"); ViewBag.Products = new SelectList(db.Products.OrderBy(g => g.Price), "Id", "ProductName", products.Id); ModelState.AddModelError("Title", "Support domestic products!"); return View(); }
在相應(yīng)的視圖中添加下面這行代碼顯示錯(cuò)誤提示信息,效果如下:
@Html.ValidationMessage("Title")
強(qiáng)類(lèi)型輔助方法
如果不習(xí)慣使用字符串字面值從視圖數(shù)據(jù)中提取值的話,可以使用ASP.NET MVC提供的各種強(qiáng)類(lèi)型輔助方法。使用強(qiáng)類(lèi)型輔助方法,只需要為其傳遞一個(gè)lambda表達(dá)式來(lái)指定要渲染的模型屬性。我們以上一節(jié)中的DropDownList為示例,修改View中的代碼,首先,在視圖頂部輸入如下所示的代碼:
@model MyFirstMvcProject.Models.Product
使用下面的代碼重寫(xiě)DropDownList:
@Html.DropDownListFor(m => m.Id, ViewBag.Products as SelectList)
效果如下:
注意,強(qiáng)類(lèi)型的輔助方法名稱(chēng)除了有For后綴外,與先前介紹的輔助方法名相同。使用強(qiáng)類(lèi)型輔助方法的優(yōu)點(diǎn)是能夠獲取智能感知以及編譯時(shí)檢查。
渲染輔助方法
渲染輔助方法可以在應(yīng)用程序中生成指向其他資源的鏈接,也可以構(gòu)建被稱(chēng)為部分視圖的可重用UI片段。
Html.ActionLink和Html.RouteLink
ActionLink輔助方法能夠渲染一個(gè)超鏈接,指向另一個(gè)控制器。如下是Products/Details視圖中的一段示例,如果沒(méi)有指定控制器,就返回當(dāng)前視圖對(duì)應(yīng)的控制器:@Html.ActionLink("Back to List", "Index")
RouteLink輔助方法只可以接受路由名稱(chēng),而不能接受控制器名稱(chēng)和操作名稱(chēng)。
@Html.RouteLink("Back to List", new { Action = "Index"})
Url.Action、Url.RouteUrl和Url.Content
URL輔助方法與HTML的ActionLink和RouteLink輔助方法相似,但它不以HTML標(biāo)記的形式返回構(gòu)建的URL,而是以字符串的形式返回這些URL。
RouteUrl輔助方法與RouteLink一樣,只接受路由名稱(chēng),而不接受控制器名稱(chēng)和操作名稱(chēng)。
Content輔助方法可以把應(yīng)用程序的相對(duì)路徑轉(zhuǎn)換成絕對(duì)路徑。Html.Partial和Html.RenderPartial
Partial和RenderPartial都是渲染一個(gè)部分視圖,都不使用Controller,Partial回傳一個(gè)MvcHtmlString,所以可以把結(jié)果保存在變量之中,RenderPartial沒(méi)有返回值,直接寫(xiě)入響應(yīng)輸出流當(dāng)中。@Html.Partial("PartialViewName")@{ Html.RenderPartial("PartialViewName"); }
Html.Action和Html.RenderAction
Action和RenderAction類(lèi)似于Partial和RenderPartial,但這兩個(gè)方法都用到Controller之后再回傳一個(gè)頁(yè)面,可以在Controller方法上添加ChildActionOnly特性,防止頁(yè)面直接被瀏覽。
http://www.cnblogs.com/Answer-Geng/p/6994427.html