如何在数据绑定控件中使用Eval调用扩展方法

时间:2008-12-16 19:27:19

标签: asp.net data-binding extension-methods late-bound-evaluation

我在int类型上有一个简单的扩展方法,所以我可以执行以下操作:

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

这在代码中效果很好,但我想在Repeater模板中使用此扩展方法。数据绑定时,我想执行以下操作:

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

这没用,所以我试过了:

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

它仍然无效。 JIT编译器没有看到我的扩展方法,并且我在页面中有正确的import语句。

解决这个问题的唯一想法是用Literal控件替换Eval并在代码隐藏中调用扩展方法,但不管怎样,我仍然想知道为什么这不起作用。

由于

5 个答案:

答案 0 :(得分:9)

我遇到了同样的问题,最终找到了解决方案。

在我的情况下,我忘了导入我的Extensionmethod类的命名空间。尽管页面后面的代码包含了命名空间,但aspx-page却没有。

我刚刚在web.config文件中添加了命名空间:

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

瞧!!

答案 1 :(得分:6)

看起来我可以回答我自己的问题! Asp.Net正在使用.Net 2.0编译器编译.aspx,.ascx模板。我需要将以下内容添加到我的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>

我仍然需要在Eval中执行强制转换为(int),但这至少对我有意义。

答案 2 :(得分:6)

为我解决它的另一个解决方案(类似于Patrik的)是在该特定控件或aspx页面上导入命名空间。

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

此解决方案更适合我的问题,因为扩展方法仅适用于一个控件中使用的类。

答案 3 :(得分:0)

Eval(“LengthInSeconds”)是否自行工作?

答案 4 :(得分:0)

命名空间声明在web.config文件中的pages元素下完成,如下所示:

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