如何在 Web 表单数据绑定表达式中使用扩展方法?
有人在数据绑定表达式中成功使用了扩展方法吗?
假设我有一个名为“GetName”的扩展方法附加到“MyClass”。
在后面的代码中,我已经验证了这一点:
MyClass myObject = new MyClass();
MyClass.GetName();
但是,在 Web 表单中,我尝试这样做:
<%@ Import Namespace="My.Namespace" %>
然后,在 Repeater 的 ItemTemplate 中:
<%# ((MyClass)Container.DataItem).GetName() %>
Visual Studio 对此很满意,Intellisense 同意一切,并且项目构建。但是当我运行它时,我得到:
编译错误
“My.Namespace.MyClass”不包含“GetName”的定义
因此,隐藏代码将接受扩展方法,但不接受 Web 表单。我怀疑这是一个名称空间问题,但我在两个地方都导入了相同的名称空间。
Has anyone successfully used extension methods in data-binding expressions?
Say I have an extension method called "GetName" attached to "MyClass".
In the code behind, I have verified this works:
MyClass myObject = new MyClass();
MyClass.GetName();
However, in a Web form, I try this:
<%@ Import Namespace="My.Namespace" %>
Then, in the ItemTemplate of a Repeater:
<%# ((MyClass)Container.DataItem).GetName() %>
Visual Studio is cool with this, Intellisense agrees with everything, and the project builds. But when I run it, I get:
Compilation Error
'My.Namespace.MyClass' does not contain a definition for 'GetName'
So, the code-behind will accept the extension method, but not the Web form. I suspect it's a name-spacing issue, but I've imported the same namespace in both places.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
aspx/ascx 文件中的数据绑定语法是出了名的挑剔。需要进行一定量的解析,特别是在这个绑定区域。看这个例子:
这个可行:
但这不行:
为什么?因为虽然 DataBinder.Eval 是一个真正的方法,但 Bind 不是。是的,确实,它只是表达式绑定器/解析器识别的标记 - 它实际上并未编译。我认为 DataBinder.Eval 可能是为了与 ASP.NET 1.1/1.0 兼容而进行的特殊处理。
为了完成这个示例,绑定上述表达式的正确方法是使用:
希望这有帮助,
澄清编辑: C# 编译器理解扩展方法。 asp.net 表达式解析器没有。
The databinding syntax in aspx/ascx files is notoriously picky. There is a certain amount of parsing that goes on, in particular in this binding area. Look at this example:
This works:
But this doesn't:
Why? Because while DataBinder.Eval is a real method, Bind is not. Yes, really, it's just a token recognized by the expression binder/parser - it's not actually compiled. I think DataBinder.Eval is probably special-cased for compatibility with ASP.NET 1.1/1.0.
Just to complete the example, the correct way to bind the above expression is to use:
Hope this helps,
Clarification Edit: The C# compiler understands extension methods. The asp.net expression parser does not.
如果您要绑定到集合并希望利用强类型类 MyClass,则可以在代码隐藏中的函数中执行扩展。
您的中继器可以使用
您的 CodeBehind 将具有:
不要忘记导入扩展模块的名称空间。
If you're binding to a collection and want to leverage the strongly typed class MyClass, you can perform the extension in a function in codebehind.
your repeater can use
Your CodeBehind will have:
Don't forget to import the namespace of your extension module.