问题创建我自己的HtmlHelper扩展

时间:2009-06-03 10:20:46

标签: asp.net-mvc model-view-controller extension-methods

我有一个HtmlHelper的扩展方法:

<%= Html.MyMethod( params )%>

它适用于visual studio,但会抛出(在运行时):

  

编译器错误消息:CS0117:'System.Web.Mvc.HtmlHelper'不包含'MyMethod'的定义

奇怪的是,这确实有效:

<%= HtmlHelperExtensions.MyMethod( Html, params ) %>

为什么我的方法不能作为扩展工作,而是作为普通的静态调用?

2 个答案:

答案 0 :(得分:7)

我在web.config中找到了答案 - 有一节告诉它如何编译嵌入HTML的C#:

<system.codedom>
    <compilers>
        <compiler language="c#;cs;csharp" 
                  extension=".cs"
                  type="Microsoft.CSharp.CSharpCodeProvider, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
        </compiler>
    </compilers>
</system.codedom>

这缺少一个额外的标志,告诉它使用3.5编译器技巧,让扩展方法和匿名类型在HTML中起作用:

<system.codedom>
    <compilers>
        <compiler language="c#;cs;csharp" 
                  extension=".cs"
                  type="Microsoft.CSharp.CSharpCodeProvider, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
            <providerOption name="CompilerVersion" value="v3.5" />
        </compiler>
    </compilers>
</system.codedom>

答案 1 :(得分:2)

确保在视图中导入包含扩展方法的命名空间。

<%@ Import Namespace="MyProject.MyExtensions"%>

或者将其添加到您的web.config中,以便它可以在每个视图中使用:

        <namespaces>
            <add namespace="System.Web.Mvc"/>
            <add namespace="System.Web.Mvc.Ajax"/>
            <add namespace="System.Web.Mvc.Html"/>
            <add namespace="System.Web.Routing"/>
            <add namespace="MyProject.MyExtensions"/>
        </namespaces>