2009-09-02 72 views
3

有沒有人在數據綁定表達式中成功使用擴展方法?如何在Web表單數據綁定表達式中使用擴展方法?

假設我有一個名爲「GetName」的擴展方法附加到「MyClass」。

在後面的代碼,我已經證實了這項工作:

MyClass myObject = new MyClass(); 
MyClass.GetName(); 

然而,在Web表單,我試試這個:

<%@ Import Namespace="My.Namespace" %> 

然後,在直放站的ItemTemplate:它

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

Visual Studio對此很酷,Intellisense同意所有內容,並且構建項目。但是,當我運行它,我得到:

編譯錯誤
「My.Namespace.MyClass」不包含「的GetName」

所以,後臺代碼將接受的定義擴展方法,但不是Web表單。我懷疑這是一個名稱空間問題,但我在兩個地方都導入了相同的命名空間。

+0

你有沒有解決過這個問題? – 2011-05-23 23:15:25

回答

3

aspx/ascx文件中的數據綁定語法非常挑剔。有一定量的解析,特別是在這個綁定區域。請看下面的例子:

這工作:

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

但這並不:

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

爲什麼?因爲雖然DataBinder.Eval是一個真正的方法,但綁定不是。是的,實際上,它只是表達式綁定器/分析器所識別的一個令牌 - 它並未實際編譯。我認爲DataBinder.Eval可能是專門爲了與ASP.NET 1.1/1.0兼容而設計的。

只是爲了完成這個例子,結合上述表達式正確的方法是使用:

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

希望這有助於

澄清編輯:的C#編譯器能擴展方法。 asp.net表達式分析器沒有。

+0

雖然這些信息可能對某些人有用,但它確實沒有解決實際問題。這就是說,我也不知道答案。 – SynBiotik 2014-01-02 16:01:03

+0

@SynBiotik我認爲從我的答案中消除的消息是,編譯器理解擴展方法,但asp.net頁面分析器/表達式聯編程序沒有。由於語法只是解析器的語法糖,編譯器將永遠不會看到它。 TL; DR:這是不可能的。 – x0n 2014-01-02 22:48:56

3

如果您綁定到一個集合並想要利用強類型類MyClass,則可以在代碼隱藏的函數中執行該擴展。

您的中繼器可以使用

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

你的代碼隱藏會有:

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

不要忘了導入您的擴展模塊的命名空間。