2011-05-24 82 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