Как вызвать методы расширения с помощью Eval в элементе управления с привязкой к данным

У меня есть простой метод расширения типа int, поэтому я могу сделать следующее:

string timeLength = 61.ToTime() // timeLength will be "1:01"

Это прекрасно работает в коде, но я хочу использовать этот метод расширения в шаблоне повторителя. При привязке данных я хочу сделать следующее:

<%# Eval("LengthInSeconds").ToTime() %>

Это не сработало, поэтому я попытался:

<%# ((int) Eval("LengthInSeconds")).ToTime() %>

и это все еще не сработало. JIT-компилятор не видит мой метод расширения, и у меня есть правильный оператор импорта на странице.

Моя единственная идея для решения этой проблемы состоит в том, чтобы заменить Eval на элемент управления Literal и вызвать метод расширения в коде, но в любом случае, я все равно хотел бы знать, почему это не работает.

Спасибо

5 ответов

Решение

Похоже, я могу ответить на свой вопрос! Asp.Net компилировал шаблоны.aspx,.ascx, используя компилятор.Net 2.0. Мне нужно было добавить следующее в мой web.config, чтобы он работал

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

Я все еще должен выполнить приведение к (int) в Eval, но это по крайней мере имеет для меня смысл.

У меня была такая же проблема, и в итоге я нашел решение.

В моем случае я забыл импортировать пространство имен моего класса Extensionmethod. Несмотря на то, что код позади страницы включает пространство имен, aspx-page нет.

Я просто добавил пространство имен в файл web.config:

<pages styleSheetTheme="Default">
  <namespaces>
    <add namespace="MyNameSpace"/>
  </namespaces>

и вуаля!

Другое решение, которое решило это для меня (аналогично Патрику), это просто импортировать пространство имен на этом конкретном элементе управления или странице aspx.

<%@ Import Namespace="My.Namespace.Containing.MyExtensions.Class" %>

Это решение было более подходящим для моей проблемы, так как методы расширения были только для класса, используемого в одном элементе управления.

Eval("LengthInSeconds") работает сам по себе?

Объявление пространства имен выполняется под элементом pages в файле web.config следующим образом:

<pages styleSheetTheme="Default">
      <namespaces>
        <add namespace="MyNamespace"/>
      </namespaces>
Другие вопросы по тегам