Как вызвать методы расширения с помощью Eval в элементе управления с привязкой к данным - PullRequest
12 голосов
/ 16 декабря 2008

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

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

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

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

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

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

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

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

Спасибо

Ответы [ 5 ]

9 голосов
/ 28 января 2009

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

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

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

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

и вуаля !!

6 голосов
/ 24 февраля 2010

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

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

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

6 голосов
/ 16 декабря 2008

Похоже, я могу ответить на свой вопрос! 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, но это, по крайней мере, имеет для меня смысл.

0 голосов
/ 28 января 2009

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

<pages styleSheetTheme="Default">
      <namespaces>
        <add namespace="MyNamespace"/>
      </namespaces>
0 голосов
/ 16 декабря 2008

Работает ли Eval ("LengthInSeconds") сам по себе?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...