[.NET MVC] @Helper 輔助方法

在.NET MVC中Razor提供了一個語法,這種語法方便我們將View中的內容抽取出來,如此變成一個獨立的輔助方法以達到function reuse.

舉例來說,假設我們在View寫了一個分流的方法:

在.NET MVC中Razor提供了一個語法,這種語法方便我們將View中的內容抽取出來,如此變成一個獨立的輔助方法以達到function reuse.

舉例來說,假設我們在View寫了一個分流的方法:

//簡單的依據秒的奇偶數導到不同的對應網站
if((DateTime.Now.Second % 2) == 0)
{
	Response.Redirect("http://www.google.com");
}
else
{
	Response.Redirect("http://tw.yahoo.com");
}

假設在不同的頁面中我們都需要這個功能,我們可以將此Method抽取出來,用@helper的方式來進行封裝:

@helper RedirectToCorretPage()
{
    //簡單的依據秒的奇偶數導到不同的對應網站
    if((DateTime.Now.Second % 2) == 0)
    {
        Response.Redirect("http://www.google.com");
    }
    else
    {
        Response.Redirect("http://tw.yahoo.com");
    }  
}
@RedirectToCorretPage();

如此我們就可以簡單的將原本分流的功能用RedirectToCorretPage這個輔助方法來表示。

跨頁的@helper輔助方法

如果一個@helper輔助方法需要用在多個不同的view頁面裡,我們需要將此輔助方法放到App_Code目錄底下,而檔案副檔名需為cshtml;而檔名就會是我們的類別名稱:

此時我們在將完整的@helper內容放到該檔案中即可(這邊由於用到Response.Redirect,所以需要引用System.Web.Mvc這個命名空間; 而在頁面呼叫時用時,則僅要打上檔案(類別)名稱.方法即可使用。

@DispatchHelper.RedirectToCorretPage();

解決App_Code中不能使用MVC Helper Methods

在學習@helper時第一個拿來當作練習的題目是做子功能連結目錄,發現像@Html.ActionLink這種輔助Method似乎無法支援,Google了一下相關討論串,其實這個支援應該已經在VS 2013實作了,但我們需將原頁面的WebViewPage物件傳入,程式碼片段如下:
@helper ShowViewLabMenu(WebViewPage page)
{
    @page.Html.ActionLink("[Help]", "Help", "Home")
    
    @page.Html.ActionLink("[Back To List]", "Index", "Home")
}

當然,要加入System.Web.Mvc及System.Web.Mvc.Html兩個命名空間才能使用WebViewPage以及ActionLink。

@using System.Web.Mvc.Html
@using System.Web.Mvc

而在使用時範例如下

@MenuHelper.ShowViewLabMenu(this)