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 表单。我怀疑这是一个名称空间问题,但我在两个地方都导入了相同的名称空间。
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 表达式解析器没有。
| 归档时间: |
|
| 查看次数: |
1314 次 |
| 最近记录: |