C# HtmlHelper扩展的动力学

C# HtmlHelper扩展的动力学,c#,asp.net-mvc,extension-methods,C#,Asp.net Mvc,Extension Methods,我习惯于在输入“this”类型后,intellisense提供的扩展方法。但是当我尝试使用HtmlHelper时,扩展方法并没有显示出来——即使存在“using”语句。为什么会这样?为了澄清这一点,我在一个常规的.cs文件中做这个测试,而不是在一个.cshtml文件中。没有什么好的理由,我只是在玩MVC名称空间和语言来“看看它是如何运作的”。我仍然不知道为什么intellisense没有收集所有4000个扩展(我举个例子,但是有很多) 说到数以千计的扩展,为什么这些助手例程作为扩展方法提供?如果

我习惯于在输入“this”类型后,intellisense提供的扩展方法。但是当我尝试使用HtmlHelper时,扩展方法并没有显示出来——即使存在“using”语句。为什么会这样?为了澄清这一点,我在一个常规的.cs文件中做这个测试,而不是在一个.cshtml文件中。没有什么好的理由,我只是在玩MVC名称空间和语言来“看看它是如何运作的”。我仍然不知道为什么intellisense没有收集所有4000个扩展(我举个例子,但是有很多)

说到数以千计的扩展,为什么这些助手例程作为扩展方法提供?如果使用了典型的静态类,那么razor签名示例可能是:

@EditorExtensions.EditorFor<T>(...)
@EditorExtensions.EditorFor(…)
似乎是可行的,“框架设计指南”规定很少使用扩展,最好:

  • 仅针对接口类型
  • 仅适用于无法重新部署的类型
  • 似乎没有任何扩展方法“标准”适用。这就是为什么我希望有常规的静态类,用静态方法来填充这个卷。理由是什么

    更新:非扩展助手的示例代码(供进一步讨论)

    公共静态类MyHelper
    {
    公共静态MvcHtmlString Go(HtmlHelper foo){
    foo.Raw(“你好”);
    返回新的MvcHtmlString(“What's up Doc

    ”; } }
    不确定为什么IntelliSense没有为您显示
    HtmlHelper
    扩展方法。您确定使用的是System.Web.Mvc.Html


    之所以将这些助手实现为扩展方法,是因为它们通常需要访问与请求、模型和,等等。如果helpers是作为静态方法实现的,那么在使其单元可测试的同时实现这一目标要困难得多。

    我对单元测试的评论很好奇。我已经更新了我的问题,加入了我刚刚从razor页面执行的代码示例。此自定义静态辅助程序与扩展方法自定义静态辅助程序之间的唯一区别是“this”参数关键字。简言之,我看不出非扩展方法助手如何更难进行单元测试。无论如何,这两种方法最终都是静态方法。更多想法?是的,它们都是静态方法。但是参数携带了静态方法实现可以使用的所有状态信息。这与页面类上命名简洁的属性相结合,允许您编写
    @Html.Helper(“value”)
    而不是
    @StaticHelpers.Helper(Html,“value”)
    ,此时,我怀疑其基本原理是双重的:(1)这是一种避免使用god对象类的解决方法,以及(2)正如您所指出的,它的语法更为简洁。我猜没有进一步的理由。
    public static class MyHelper
    {
        public static MvcHtmlString Go(HtmlHelper foo){
            foo.Raw("Hello");
            return new MvcHtmlString("<p>What's up Doc</p>");
        }
    }