2011-05-24 81 views
3

在'this'類型被鍵入之後,我習慣於通過intellisense呈現擴展方法。但是當我用HtmlHelper試試這個時,擴展方法不顯示 - 即使'using'語句存在。爲什麼是這樣?爲了澄清,我從一個普通的.cs文件而不是.cshtml文件中進行這個測試。沒有什麼好的理由,我只是在玩MVC命名空間和語言來「看它是如何剔出的」。我仍然不知道爲什麼intellisense沒有收到所有4000個擴展(我誇大,但有很多)。HtmlHelper擴展的動態

說到數以千計的擴展,爲什麼這些幫助程序提供了擴展方法?如果已使用的典型靜態類,可能是樣本剃刀簽名是:

@EditorExtensions.EditorFor<T>(...) 

似乎是可行的,而「框架設計指南」指出,擴展應該很少被使用,優選:

  1. 僅針對接口類型。僅在不能被類型
  2. 重新部署

它似乎沒有任何的擴展方法「標準」適用。這就是爲什麼我會預期普通的靜態類,用靜態方法來填充這個文件。基本原理是什麼?

更新:非擴展幫助的示例代碼(進一步討論)

public static class MyHelper 
{ 
    public static MvcHtmlString Go(HtmlHelper foo){ 
     foo.Raw("Hello"); 
     return new MvcHtmlString("<p>What's up Doc</p>"); 
    } 
} 

回答

2

不知道爲什麼智能感知未顯示你HtmlHelper擴展方法。你確定你是using System.Web.Mvc.Html

這些助手是作爲擴展方法實現的原因是因爲他們經常需要訪問與請求,模型等相關的各種狀態。實現這個目標的同時仍然需要幫助者單元如果它們是作爲靜態方法實現的,則可以測試。

+0

我很好奇單元測試評論。我已經更新了我的問題,以包含我剛剛從剃鬚刀頁面執行的代碼示例。這個自定義靜態助手和擴展方法自定義靜態助手之間的唯一區別就是'this'參數關鍵字。總之,我不明白非擴展方法助手如何更難以進行單元測試。無論哪種方式,都是最終的靜態方法。更多的想法? – 2011-05-24 07:02:49

+0

是的,它們都是靜態方法。但[HtmlHelper'](http://msdn.microsoft.com/en-us/library/system.web.mvc.htmlhelper(v = VS.98).aspx)參數是攜帶所有狀態信息的然後可以使用靜態方法的實現。這與頁面類中簡潔命名的屬性相結合可以讓你編寫'@ Html.Helper(「value」)'而不是'@ StaticHelpers.Helper(Html,「value」)' – marcind 2011-05-24 07:24:04

+0

在這一點上,我懷疑理由有兩個方面:(1)避免擁有一個神對象類是一種解決方法,(2)它有更多的consise語法 - 正如你所指出的那樣。我猜測沒有進一步的理由。 – 2011-05-26 04:20:59