2011年8月24日

ASP.NET MVC – Razor的@helper語法

這篇是從ScottGu那邊看來的,之前和同事的每週技術分享報告上,有分享過,但後來也隨著時間,投影片就這樣消失於地球上,剛好最近又看到這個東西,就順便把他分享出來吧。

有的時候,在View上面,也是會需要做到許多重複的事情,例如下面這個例子,將成績輸出到View,如果大於等於60會顯示及格,若小於60就顯示不及格。

<html>
<head>
    <title>Index</title>
</head>
<body>
    <div>
        @if ( int.Parse(ViewData["score"].ToString()) >= 60)
        {
            <span>合格!</span>
        }
        else
        {
            <span>不合格!</span>
        }
    </div>
</body>
</html>

這是很簡單的例子,但搞不好會有很多頁都會需要做這樣的判斷,並顯示,如果用老方法拷貝貼上大法,當然可以很快,但這樣就會變得很難維護,總之Razor的@helper就是解決這個問題,我們可以將程式碼改成這樣。

@helper DisplayScore(int score)
{
    if (score > 60)
    {
    <span>合格!</span>
    }
    else
    {
    <span>不合格!</span>
    }
}

<!DOCTYPE html>

<html>
<head>
    <title>Index</title>
</head>
<body>
    <div>
        @DisplayScore(int.Parse(ViewData["score"].ToString()))
    </div>
</body>
</html>

如上程式碼,我們將原本的判斷邏輯提出來,並且放到@helper DisplayScore裡面,這樣就可以重複使用,而這就是@helper的用法,最後我們可以直接使用@DisplayScore來呼叫放在@helper裡面的方法,就是這樣簡單~

但是這樣做,也只能使用到同一張Page,如果要不同張的Page使用的話,要怎麼辦呢?其實可以將@helper放到app_code裡面,如下圖,這樣就可以在其他的Page裡面使用。

image

另外,因程式碼移出至App_Code,所以原本的View表,也要稍微修改一下,需要在DisplayScore前面加上命名空間(也就是放在App_Code的檔案 )如下。

<!DOCTYPE html>

<html>
<head>
    <title>Index</title>
</head>
<body>
    <div>
        @Sky.DisplayScore(int.Parse(ViewData["score"].ToString()))
    </div>
</body>
</html>

但要注意到的一點,在App_Code裡面不能使用任何的ASP.NET MVC helper methods,例如Html.ActionLink()、Html.TextBox()等等,這部分官方也說未來會再改進,但不管如何還是將此方法提供給大家參考使用。

參考來源:

  1. ScottGu Blog
  2. 解決無法在App_Code無法使用Helper method之方法

沒有留言:

張貼留言