表單的使用


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)GETPOST
后退按鈕/刷新無(wú)害數(shù)據(jù)會(huì)被重新提交(瀏覽器應(yīng)該告訴用戶數(shù)據(jù)會(huì)被重新提交)
書(shū)簽可收藏為書(shū)簽不可收藏為書(shū)簽
緩存能被緩存不能緩存
編碼類(lèi)型application/x-www-form-urlencodedapplication/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)品

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開(kāi)發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xù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,效果如下:

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開(kāi)發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)

在文本框中輸入MateBookX,點(diǎn)擊search按鈕,得到查詢結(jié)果。

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開(kāi)發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)

通過(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ò)展方法。

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開(kāi)發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)

下面,我們將介紹一些常用的輔助方法:

  • 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>
    Name

  • Html.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)

    大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開(kāi)發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)

  • 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")

    大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開(kāi)發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)


強(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)

效果如下:

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開(kāi)發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)

注意,強(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