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ù)。

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

模版輔助方法
利用元數(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>

-
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();
}

前面的都是一些常用的視圖幫助類,我們可以使用他們來完成前臺(tái)部分代碼的編寫。
自己不努力,別人是沒辦法的。