[.NET MVC] @function介紹以及其與@helper的差異

摘要:[.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){
  1. @foreach(var item in items){
  2. @item
  3. }
}

藉由強大的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