ASP.NET MVC5----了解我們使用的@HTML幫助類

20幾歲,怕什么。

: 自己的感覺

說一個(gè)自己最近使用AngularJS的感受,我們之前使用mvc進(jìn)行項(xiàng)目開發(fā)都是了解和經(jīng)常使用HTML的幫助類,來完成我們前端大部分代碼的編寫,其實(shí)在我沒有接觸AngularJS之前對(duì)于這種方法還是很喜歡的,畢竟它是將.aspx頁面革命掉的東西,但是隨著項(xiàng)目中使用AngularJS我越來越喜歡這種將前后端分開的開發(fā)模式,我相信這就是以后的發(fā)展形勢(shì)。但是眼下這個(gè)MVC還是要快快的用好。

:了解HTML幫助類的內(nèi)在美

HTML輔助方法利用路由引擎找到HomeController控制器的Search操作,他在后臺(tái)使用GetVirtualPath方法,該方法在RouteTable的Routes屬性中,在global.asax中,Web應(yīng)用程序注冊(cè)所有的路由位置。

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
    }

通過RouteConfig.RegisterRoutes(RouteTable.Routes);來實(shí)現(xiàn)我們輔助方法的實(shí)現(xiàn)。下面我們看下要是不需要這個(gè),如何實(shí)現(xiàn)我們的輔助方法。

  • 一般的寫法:
@using (Html.BeginForm("Search","Admin",FormMethod.Post))
{
    <input type="text" name="text"/>
    <input type="submit" name="sub" value="Search"/>
}

  • 不使用HTML幫助類的寫法:
@{
    var context = this.ViewContext.RequestContext;   //請(qǐng)求上下文
    var values = new RouteValueDictionary               //不區(qū)分大小寫的鍵值對(duì)集合
    {
        {"controller","home"},
        {"action","index"}
    };
    var path = RouteTable.Routes.GetVirtualPath(context, values);      //返回與路由相關(guān)的URL
}
<form action="@path.VirtualPath",method="POST">
    <input type="text" name="text" />
    <input type="submit" name="sub" value="Search" />
</form>

現(xiàn)在我們看要是不使用幫助類就必須寫這么多的代碼,可以發(fā)現(xiàn)VS將我們需要寫的代碼全都封裝起來,使用起來很方便。

輔助方法工作原理

每一個(gè)Razor視圖都繼承了它們的基類HTML屬性,HTML屬性的類型是System.Web.Mvc.HtmlHelper<T>;T是一個(gè)泛型類型的參數(shù),代表傳遞給視圖的模型類型(默認(rèn)是dynamic),這個(gè)屬性提供了一些可以在視圖中調(diào)用的實(shí)例方法,還有很多擴(kuò)展方法(.出來,方法名稱左邊有一個(gè)向下的箭頭)。
:常用的輔助方法

  • :每一個(gè)輔助方法都有一個(gè)htmlattributs屬性,可以設(shè)置頁面的html屬性。

  • :輔助方法大多數(shù)都是檢查ViewDate對(duì)象以獲取要顯示的當(dāng)前值(ViewBag對(duì)象中所有值也可以獲取到)

  • :輔助方法不僅可以查看ViewData內(nèi)部的數(shù)據(jù),也可以得到模型元數(shù)據(jù) 。

  • Html.BeginForm
    提交表單時(shí)使用,這個(gè)一般和@using(){}一起,這樣就可以釋放掉資源。輔助方法在調(diào)用結(jié)束期間生成一個(gè)起始標(biāo)簽,并返回一個(gè)實(shí)現(xiàn)了接口IDisposable的對(duì)象。這樣就可以在using(){]方法里面被釋放掉。

  • Html.ValidationSummary()

        @Html.ValidationSummary(excludePropertyErrors:true)   //顯示模型級(jí)別的錯(cuò)誤。

此方法用來顯示ModelState字典中所有驗(yàn)證錯(cuò)誤的無序列表,使用參數(shù)(bool)來告知輔助方法錯(cuò)誤的級(jí)別。(顯示與模型本身相關(guān)的錯(cuò)誤,不顯示模型屬性相關(guān)的錯(cuò)誤。)

    public ActionResult Search()
    {
        ModelState.AddModelError("","模型級(jí)別的錯(cuò)誤");   //設(shè)置為true
        ModelState.AddModelError("Title", "模型屬性級(jí)別的錯(cuò)誤");   //設(shè)置為false
        return View();
    }Html.TextBox和Html.TextArea

都是顯示文本,第一個(gè)是文本框Text,第二個(gè)是TextArea;TextArea可以設(shè)置顯示指定的行數(shù)和列數(shù)。

Andyahui
  • Html.Label
    返回一個(gè)label元素,并使用String類型的參數(shù)來決定渲染的文本和for特性值。這個(gè)一般使用顯示輸入框的標(biāo)題。將模型屬性中的Display(“姓名”)顯示出來。

      [Display(Name = "姓名")]
      public string Name { get; set; }
    
  • Html.DropDownList和Html.ListBox
    這兩個(gè)都是返回一個(gè)<select/>元素。DropDownList第一個(gè)是單向選擇,ListBox為多項(xiàng)選擇。

關(guān)于下拉列表,它需要一個(gè)包含所有可選項(xiàng)的SelectListItem對(duì)象集合,其中每一個(gè)SelectListItem對(duì)象集合中有包含有Text,Value和Selected三個(gè)屬性??梢愿鶕?jù)需要構(gòu)建自己的SelectListItem對(duì)象集合。
看一下之前項(xiàng)目中使用的下拉,之前不是很理解原理,現(xiàn)在看書說是為了避免反射開銷的同時(shí)自己生成的SelectListItem集合,使用的是Linq的Select方法來將SelectListItem對(duì)象集放入項(xiàng)目中。

  • Html.ValidationMessage
    當(dāng)ModelState字典中的某一特定字段出現(xiàn)錯(cuò)誤時(shí),可以使用ValidationMessage輔助方法來顯示相應(yīng)的錯(cuò)誤消息。這個(gè)一般情況就是在服務(wù)端驗(yàn)證的時(shí)候顯示錯(cuò)誤消息。
  • Html.Hidden
    將一些必要的屬性(ID)通過隱藏的方式傳遞--提交表單。
  • Html.PassWord
    這個(gè)是密碼框輸入的值為隱藏的。之前一直沒有使用這個(gè),看來以后要多多使用。
  • Html.RadioButton
    單選按鈕一般組合使用,為用戶的單項(xiàng)選擇提供一組可選項(xiàng)。
    @Html.RadioButton("color","red",true)
    @Html.RadioButton("color","blue")
    @Html.RadioButton("color", "green")
  • Html.CheckBox
    是唯一一個(gè)渲染兩個(gè)輸入元素的輔助方法。是一個(gè)隱藏域hidden。
@Html.CheckBox("checkbox")
Andyahui
模版輔助方法

利用元數(shù)據(jù)和模版構(gòu)建HTML,其中元數(shù)據(jù)包括關(guān)于模型值(名稱和類型)的信息和(通過數(shù)據(jù)注解或自定義提供器添加)模型元數(shù)據(jù)。

  • Html.Display
    可以操作模型上面綁定的一些值。
  • Html.Editor
    也是設(shè)置文本框的,好的一點(diǎn)是可以通過模型上面綁定的值來顯示HTML。
輔助方法與ModelState

用戶顯示表單值得所有輔助方法也需要與ModelState字典交互。其實(shí)ModelState是模型綁定的副產(chǎn)品,并且存儲(chǔ)模型綁定期間檢測(cè)到的所有驗(yàn)證錯(cuò)誤,以及用戶提交用來更新模型的原始值(驗(yàn)證失敗,再次回到視圖中顯示之前輸入的值)。

渲染輔助方法
  • Html.ActionLink
    渲染成一個(gè)超鏈接。這個(gè)效果是一個(gè)默認(rèn)路由。
  • Url.Action
    這個(gè)是渲染一部分路徑。
    @Html.ActionLink("Link Text","Index")    
    <br />
    <a href="@Url.Action("Index")">123</a>
Andyahui
  • Html.RouteLink
    這個(gè)說實(shí)在的和前面那個(gè)是一樣的。只是這個(gè)只可以接收路由名稱,而不能接收控制器名稱和操作方法

    @Html.RouteLink("Link Text",new{Action="Index"})URl輔助方法
    
  • Url.Action
    這個(gè)和之前介紹的一樣。這個(gè)只是顯示部分路徑。

  • Url.Content
    可以把用戶程序的相對(duì)路徑轉(zhuǎn)換為絕對(duì)路徑?,F(xiàn)在項(xiàng)目中還沒使用過。

     @Url.Content("~/Scripts/_references.js")   //~:可以看作為應(yīng)用程序的根目錄
    
  • Url.RouteUrl
    和之前一樣,只接收路由名。

  • Html.Partial和Html.RenderPartial
    Partial方法用于將部分視圖渲染為字符串。也就是局部試圖。
    RenderPartial返回的不是字符串,而是直接寫入響應(yīng)輸出流。使用的時(shí)候必須將此放入代碼塊中。

@{
    Html.RenderPartial("List");
}
  • Html.Action和Html.RenderAction
    和上面的一樣,Partial輔助方法通常在單獨(dú)的文件中應(yīng)用視圖標(biāo)記來幫助視圖渲染視圖模型的一部分,Action執(zhí)行單獨(dú)的控制器操作,并顯示結(jié)果。其實(shí)action是需要走方法里面的。需要執(zhí)行一些邏輯的時(shí)候可以使用。
    RenderAction也是可以直接寫入響應(yīng)流之中。用的地方不是很多。

      @Html.Action("Search",new{student=new Student{Age = 12,Name = "Andyahui"}})
    

    [ChildActionOnly]
    public ActionResult Search(Student student)
    {
        ModelState.AddModelError("","模型級(jí)別的錯(cuò)誤");   //設(shè)置為true
        ModelState.AddModelError("Title", "模型屬性級(jí)別的錯(cuò)誤");   //設(shè)置為false
        return View();
    }

Andyahui

前面的都是一些常用的視圖幫助類,我們可以使用他們來完成前臺(tái)部分代碼的編寫。

自己不努力,別人是沒辦法的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,525評(píng)論 19 139
  • MVC與ASP.NET MVC基礎(chǔ)概念 MVC是Model-View-Controller的縮寫. MVC將應(yīng)用程...
    小明yz閱讀 2,977評(píng)論 0 11
  • 翻譯自“Collection View Programming Guide for iOS” 0 關(guān)于iOS集合視...
    lakerszhy閱讀 4,061評(píng)論 1 22
  • 新房交房是一個(gè)令人期待的環(huán)節(jié),比拆快遞刺激幸福n倍的感覺,很多人交房前就想象自己的房子要裝修成什么風(fēng)格,該怎么來設(shè)...
    沒個(gè)性的少女閱讀 285評(píng)論 0 1
  • 我是不是愛好有點(diǎn)寬泛,什么都懂一點(diǎn),卻發(fā)現(xiàn)沒有一個(gè)是能精的,不妙不妙矣!定要改之!
    大大大榴蓮閱讀 164評(píng)論 0 0

友情鏈接更多精彩內(nèi)容