Проблема создания моего собственного расширения HtmlHelper - PullRequest
3 голосов
/ 03 июня 2009

У меня есть метод расширения HtmlHelper:

<%= Html.MyMethod( params )%>

Работает в visual studio, но выдает (во время выполнения):

Сообщение об ошибке компилятора: CS0117: «System.Web.Mvc.HtmlHelper» не содержит определения «MyMethod»

Странно, что это работает:

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

Почему мой метод не работает как расширение, а работает как обычный статический вызов?

Ответы [ 2 ]

7 голосов
/ 03 июня 2009

Я нашел ответ в web.config - есть раздел, в котором рассказывается, как компилировать C #, встроенный в 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">
        </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>
2 голосов
/ 03 июня 2009

Убедитесь, что вы импортируете пространство имен, содержащее метод расширения в вашем представлении.

<%@ 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>
...