摘要:[.NET MVC] @function介紹以及其與@helper的差異
當一開始看到@functions 與@helpers時,會覺得兩者好相似啊,目的都是為了提高view中程式碼的重複使用性,但實際上來說兩者還是有著一些差別。
- @helper: 將Razor語法的程式碼片段封裝成一個方法,其輸出是HelperResult以產生HTML供瀏覽器來讀取。
- @function:一種靜態撰寫方法,寫其來就像一般C#函式,回傳的型別並沒有限制。
而何時該用helper何時該用function呢? 當你要封裝的重點在於邏輯判斷、操作時,我們應該使用function,像是一個身份驗證、資料比對的功能,我們應該以function來撰寫;而當著重在HTML的輸出時,則應該藉由Razor語法的簡便,以helper來達到封裝。
接下來的例子以mikesdotnetting中介紹的例子來說明,他舉了一個很精典的例子,假設我們要做一個排序的功能,我們可以分別用@helper以及@function的方式來撰寫:
@helper範例
@helper OrderedList(IEnumerable items){-
@foreach(var item in items){
- @item
-
}
}
藉由強大的Razor,這個輔助方法看起來很精簡,但如果這個需求以@function來實作的話...
@using System.Web.Mvc;
@using System.Text;
@functions {
public static HtmlString OrderedList(IEnumerable items)
{
var sb = new StringBuilder();
var orderedList = new TagBuilder("ol");
foreach(var item in items){
var listItem = new TagBuilder("li");
listItem.SetInnerText(item);
sb.AppendLine(listItem.ToString(TagRenderMode.Normal));
}
orderedList.InnerHtml = sb.ToString();
return new HtmlString(orderedList.ToString(TagRenderMode.Normal));
}
}
在看到這裡時,相信心裡面對何時該用@helper應該已經有點掌握了,由function來達到大量的html輸出,不僅難以閱讀也難以維護。
而假設我們要作一段資驗驗證,畢免使用者在生日的欄位上不會填入未來日期,我們在度分別以兩種方式來撰寫。
@function
public static bool BeforeToday(DateTime birthDate)
{
return (birthDate < DateTime.Now);
}
@helper
@helper BeforeToday(DateTime birthDate)
{
if(birthDate > DateTime.Today)
{
@:大於
}
else
{
@:小於
}
}
這個例子又可以看兩者大大不同之處,由於function能回傳任何型別,所以以function撰寫的方法並不需要干涉到UI,UI的部份可以讓呼叫BeforeToday的地方在額外撰寫即可。反之,用helper撰寫的案例因為需以helperResult的型式包裝,便限制了回傳的呈現方式。
Reference
想看原文請點連結:
http://www.mikesdotnetting.com/article/173/the-difference-between-helpers-and-functions-in-webmatrix