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

发布于 2024-08-03 15:03:53 字数 624 浏览 10 评论 0原文

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

假设我有一个名为“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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

聚集的泪 2024-08-10 15:03:53

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

这个可行:

<%# String.Format("{0:C}", DataBinder.Eval("Foo")) %>

但这不行:

<%# String.Format("{0:C}", Bind("Foo")) %>

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

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

<%# Bind("Foo", "{0:C}") %>

希望这有帮助,

澄清编辑: 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:

<%# String.Format("{0:C}", DataBinder.Eval("Foo")) %>

But this doesn't:

<%# String.Format("{0:C}", Bind("Foo")) %>

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:

<%# Bind("Foo", "{0:C}") %>

Hope this helps,

Clarification Edit: The C# compiler understands extension methods. The asp.net expression parser does not.

感受沵的脚步 2024-08-10 15:03:53

如果您要绑定到集合并希望利用强类型类 MyClass,则可以在代码隐藏中的函数中执行扩展。

您的中继器可以使用

<%# GetObjectName((MyClass)Container.DataItem) %>

您的 CodeBehind 将具有:

protected string GetObjectName(MyClass obJect)
    {
        return obJect.GetName();
    }

不要忘记导入扩展模块的名称空间。

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

<%# GetObjectName((MyClass)Container.DataItem) %>

Your CodeBehind will have:

protected string GetObjectName(MyClass obJect)
    {
        return obJect.GetName();
    }

Don't forget to import the namespace of your extension module.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文