【问题标题】:Dynamics of HtmlHelper ExtensionsHtmlHelper 扩展的动态
【发布时间】:2011-08-31 16:18:01
【问题描述】:

我习惯了智能感知提供的扩展方法,在键入“this”类型之后。但是,当我使用 HtmlHelper 尝试此操作时,扩展方法不会显示 - 即使存在“使用”语句。为什么是这样?澄清一下,我是在常规 .cs 文件而不是 .cshtml 文件中进行此测试。没有充分的理由,我只是在使用 MVC 命名空间和语言来“看看它是如何运行的”。我仍然不知道为什么智能感知没有拾取所有 4000 个扩展(我夸大了,但有很多)。

说到成千上万的扩展,为什么这些辅助例程作为扩展方法提供?如果使用了典型的静态类,可能一个示例 razor 签名将是:

@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>");
    }
}

【问题讨论】:

    标签: c# asp.net-mvc extension-methods


    【解决方案1】:

    不确定为什么 IntelliSense 没有为您显示 HtmlHelper 扩展方法。你确定你是using System.Web.Mvc.Html

    这些助手被实现为扩展方法的原因是因为它们经常需要访问与请求、模型等相关的各种状态。要实现这个目标要困难得多,同时还要让助手单元化——如果它们被实现为静态方法,则可测试。

    【讨论】:

    • 我对单元测试评论很好奇。我已经更新了我的问题以包含我刚刚从剃须刀页面执行的代码示例。此自定义静态助手和扩展方法自定义静态助手之间的唯一区别是“this”参数关键字。简而言之,我看不出非扩展方法助手如何更难进行单元测试。无论哪种方式,两者最终都是静态方法。更多想法?
    • 是的,它们都是静态方法。但是HtmlHelper 参数承载了静态方法的实现可以使用的所有状态信息。这与页面类上简洁命名的属性相结合,允许您编写 @Html.Helper("value") 而不是 @StaticHelpers.Helper(Html, "value")
    • 在这一点上,我怀疑理由是双重的:(1)这是一种避免拥有上帝对象类的解决方法,以及(2)它具有更简洁的语法 - 正如您所指出的那样出去。我猜没有进一步的理由。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 2011-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-02
    相关资源
    最近更新 更多