從開發者的角度來看,創建Asp.net MVC的View是一件很爽的事,因為你可以精確控制最終生成的HTML 。具有諷刺意味的是不得不寫出每一行HTML代碼同時也是Asp.net MVC的View中讓人不爽的地方。讓我用 我的一個經歷來告訴我創建ASP.Net MVC view Helpers背後靈感的由來。由一小部分開發人員(包括我) 和一個CSS設計人員(我們叫他Ricky)組成的小組,開始了一個新的Asp.net MVC的項目,在項目開發過程 中;我給頁面添加了一些TextBox和一些其他元素,我check-in了我的代碼,直到回家我也沒再想起過這 事。隔夜早晨,剛上班時我就從CSS設計那裡收到一封郵件來通知我我必須按照他的CSS指導方針來寫HTML ,比如說對於textbox,必須遵循以下規則:
每個textbox必須內嵌在li標簽中
每一個textbox都必須有一個label標簽的for屬性與之對應
textbox必須使用input標簽並設置type屬性為text
對於這些要求我一一照做並修改我的代碼符合了後兩條規則,但我忘了關於li的指導方針,我很快更新 了頁面並提交了我的代碼。幾天後,項目又推進了很多,Ricky來到我的辦公桌前並讓我看看我所做的改 變。打開頁面,他開始一一列舉那些我不遵循它的UI規定的地方,有很多地方我都忽視了因為我甚至不知 道這些指導方針的存在.在他指出這些後,我想:一定會有方法可以讓我們兩個人都如願以償.對於我來說 只是需要html標簽的id,對於Ricky來說他需要我的HTML符合規范來讓他的CSS文件能夠選擇到合適的html 。所以我們引入了view helper.
在我用Asp.net MVC時我注意到我自己寫了很多純Html,比如div和span,同時伴隨使用了很多 System.Web.Mvc.HtmlHelper來生成html,比如說一個輸入名字的textbox:
<li>
<label for="FirstName">First name</label>
<%= Html.TextBox("FirstName") %>
<%= Html.ValidationMessage("FirstName", "*") %>
</li>
我就想,是不是能有一種方法來將上面的所有代碼融合在一起呢。這樣不僅讓我編程更加輕松,而且 再也不用擔心Ricky給我設置的條條框框了。理想的情況下會滿足以下標准:
容易執行
重用性好
強制執行某些標准(比如Ricky的)
和標准的HtmlHelper擴展方法用起來沒太大區別
容易使用
在我們進入執行這個的細節之前如果你感覺這聽起來像又回到了Web Form時代,那就錯了。view helper僅僅是在創建HTML的時候起輔助作用,而不是將HTML進行抽象。我關心的只是HTML在頁面中的顯示 效果以及使用javascript的行為更輕松.而不是textbox是否放入li中,當我需要創建一個textbox時,我只 需在view中放入如下代碼:
<% Html.NewText("FirstName", "First name"); %>
我想聲明我僅僅是想將創建HTML延遲到另一個類中。使用View helper我可以輕松做到這一點。首先我 們先來看標准的HtmlHelper擴展方法如何做到這一點.
Html helper有兩種實現用法,大多數的使用方法都會如下:
<%= Html.TextBox("FirstName") %>