如何在 Web 表单数据绑定表达式中使用扩展方法?

Dea*_*ane 5 data-binding extension-methods webforms

有人在数据绑定表达式中成功使用了扩展方法吗?

假设我有一个名为“GetName”的扩展方法附加到“MyClass”。

在后面的代码中,我已经验证了这一点:

MyClass myObject = new MyClass();   
MyClass.GetName();
Run Code Online (Sandbox Code Playgroud)

但是,在 Web 表单中,我尝试这样做:

<%@ Import Namespace="My.Namespace" %>
Run Code Online (Sandbox Code Playgroud)

然后,在 Repeater 的 ItemTemplate 中:

<%# ((MyClass)Container.DataItem).GetName() %>
Run Code Online (Sandbox Code Playgroud)

Visual Studio 对此很满意,Intellisense 同意一切,项目就构建起来了。但是当我运行它时,我得到:

编译错误
“My.Namespace.MyClass”不包含“GetName”的定义

因此,隐藏代码将接受扩展方法,但不接受 Web 表单。我怀疑这是一个名称空间问题,但我在两个地方都导入了相同的名称空间。

x0n*_*x0n 4

aspx/ascx 文件中的数据绑定语法是出了名的挑剔。需要进行一定量的解析,特别是在这个绑定区域。看这个例子:

这有效:

<%# String.Format("{0:C}", DataBinder.Eval("Foo")) %>
Run Code Online (Sandbox Code Playgroud)

但这并没有:

<%# String.Format("{0:C}", Bind("Foo")) %>
Run Code Online (Sandbox Code Playgroud)

为什么?因为虽然 DataBinder.Eval 是一个真正的方法,但 Bind 不是。是的,确实,它只是表达式绑定器/解析器识别的标记 - 它实际上并未编译。我认为 DataBinder.Eval 可能是为了与 ASP.NET 1.1/1.0 兼容而进行的特殊处理。

为了完成示例,绑定上述表达式的正确方法是使用:

<%# Bind("Foo", "{0:C}") %>
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助,

澄清编辑: C# 编译器理解扩展方法。asp.net 表达式解析器没有。

  • 虽然这些信息可能对某些人有用,但它确实没有解决实际问题。也就是说,我也不知道答案。 (2认同)