2015-01-14 83 views
0

我編寫了下面的代碼來格式化C#MVC 5網站上的價格。再看一遍,我不知道它是如何工作的。MVC擴展方法HtmlHelper方法簽名語法

什麼是「this」關鍵字在靜態函數方法簽名中做的事情?爲什麼我需要傳入html參數,它不在函數中使用?這甚至是如何編譯的?

This HtmlHelper html是我發現混淆的部分。如何以這種方式使用「this」關鍵字是合法的?

public static MvcHtmlString PrettyUSD(this HtmlHelper html, int amount) 
     { 
      if (amount == 0) 
      { 
       return MvcHtmlString.Create("N/A"); 
      } 
      else 
      { 
       return MvcHtmlString.Create(string.Format("{0:C0}", amount)); 
      } 
     } 

回答

2

這是一個extension method。擴展方法只是一個語法糖。這是this關鍵字,它實際上將此方法標記爲擴展方法。

從文檔:

擴展方法使你「增加」的方法,以現有的類型,而無需創建一個新的派生類型,重新編譯,或以其他方式修改原始類型。擴展方法是一種特殊的靜態方法,但它們被稱爲擴展類型上的實例方法。對於用C#和Visual Basic編寫的客戶端代碼,調用擴展方法和實際在類型中定義的方法之間沒有明顯區別。

你可以叫你的方法是這樣的:

html.PrettyUSD(42); 

這是嚴格相同的:

YourClassName.PrettyUSD(html, 42); 

這是相同的機制,可以讓你寫,如:

new[] { 1, 4, 10, 42 }.Average(); 

Array type do esn't有Average方法,但System.Linq.Enumerable類有這樣定義一個(至少是它的重載之一):

public static double Average(this IEnumerable<int> source) 

正如你所看到的,這可以讓你定義的方法一樣,如果它是聲明在IEnumerable<int>界面上。

你的功能不使用HtmlHelper類,但它的使用,以便它可以在傳統的ASP.NET MVC剃刀方式使用:

The price is <strong>@Html.PrettyUSD(42)</strong> 
+0

這就是javascripty!所以在方法簽名中使用「this」關鍵字是慣用的?在一個參數中使用3個令牌看起來很奇怪。 –

+0

是的,它是C#語法。並且相信我,當你鏈接這些方法時它讀得更好:'something.Where(...)。Distinct()'比Enumerable.Distinct(Enumerable.Where(something,...))更容易閱讀' 。想象你有一個更長的鏈。 –

+0

我總是想知道這些「流利」風格的API是如何編譯的。謝謝! –

2

要回答「爲什麼我需要通過在在所有的HTML參數,它不使用的功能?「...

在你的具體情況下,你不使用它,但它可以是非常有用的,因爲它可以讓你訪問ViewBag,ViewData和很多其他屬性。例如,下面是一個擴展方法,它用<br />替換換行符來格式化文本,它使用lambda表達式而不是直接值。

public static MvcHtmlString DisplayWithBreaksFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression) 
{ 
    var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData); 
    var model = html.Encode(metadata.Model).Replace(Environment.NewLine, "<br />"); 

    if (String.IsNullOrEmpty(model)) 
     return MvcHtmlString.Empty; 

    return MvcHtmlString.Create(model); 
} 

注意它是如何評估expressionhtml.ViewData獲取模型屬性的格式。用法如下:

Html.DisplayWithBreaksFor(model => model.Description)

+0

我非常感謝! –