MonoRail 時代的 Helper 綁定在 Controller 上(透過 [Helper(typeof(ChHelper))] 屬性),但 Helper 實際用於 View,這稍微違背關注點分離。ASP.NET MVC 採用不同機制:View 也有代碼後置檔,繼承 ViewPage,可在其中定義屬性注入自訂 Helper。
以字串擴展為例,提供紅/綠色標記方法:
public class StringHelper
{
public string Red(string str)
{
return string.Format(@"{0}", str);
}
public string Green(string str)
{
return string.Format(@"{0}", str);
}
}
在 Index.aspx.cs 中加入自動實作屬性:
public partial class Index : ViewPage
{
public StringHelper Str { get; set; }
}
透過屬性呼叫 Helper 方法:
<%= Str.Red(ViewData["title"]) %>
若需在多個 View 共用,可建立自訂基類 BaseViewPage : ViewPage,在其中定義 Helper 屬性,再讓所有 View 頁面繼承該基類。Master 頁同理,透過 ViewMasterPage 基類實現。
ASP.NET MVC 透過 View 代碼後置的屬性注入方式,讓 Helper 更貼近使用場景,符合關注點分離原則,並易於透過基類統一管理。