12

ich eine einfache Erweiterung Methode auf dem int-Typ haben, so kann ich folgendes tun:Wie Aufruf Methoden Erweiterung mit Eval in einem Databound-Steuerung

string timeLength = 61.ToTime() // timeLength will be "1:01" 

Dies funktioniert gut in Code, aber ich möchte dies nutzen Erweiterungsmethode in einer Repeater-Vorlage. Wenn Datenbindung möchte ich folgendes tun:

<%# Eval("LengthInSeconds").ToTime() %> 

Das ist nicht so funktionierte ich versucht:

<%# ((int) Eval("LengthInSeconds")).ToTime() %> 

und es funktionierte immer noch nicht. Der JIT-Compiler sieht meine Erweiterungsmethode nicht und ich habe die richtige Import-Anweisung auf der Seite.

Meine einzige Idee, dies zu lösen, ist das Eval durch ein Literal-Steuerelement zu ersetzen und die Erweiterungsmethode im Code-Behind aufzurufen, aber ich würde trotzdem gerne wissen, warum das nicht funktioniert.

Dank

Antwort

6

Sieht so aus, als ob ich meine eigene Frage beantworten kann! Asp.Net kompilierte die .aspx-, .ascx-Vorlagen mit dem .Net 2.0-Compiler. Ich brauchte die folgenden meiner web.config hinzufügen, um es

<system.codedom> 
    <compilers> 
     <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CSharp.CSharpCodeProvider,System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" warningLevel="4"> 
     <providerOption name="CompilerVersion" value="v3.5"/> 
     <providerOption name="WarnAsError" value="false"/> 
     </compiler> 
    </compilers> 
    </system.codedom> 

Ich habe immer noch die Besetzung zu (int) führen in der Eval arbeiten, aber, dass zumindest macht Sinn für mich.

+0

Das war * genau * was ich gesucht habe - vielen Dank! –

0

Does Eval ("LengthInSeconds") die Arbeit von selbst?

+0

Ja, das gab nur das int in String-Form zurück. –

9

Ich hatte das gleiche Problem und fand schließlich die Lösung.

In meinem Fall hatte ich vergessen, den Namespace meiner Extensionmethod-Klasse zu importieren. Auch wenn der Code hinter der Seite den Namespace enthielt, tat dies die aspx-Seite nicht.

Habe ich nur noch den Namespace in der Datei web.config:

<pages styleSheetTheme="Default"> 
    <namespaces> 
    <add namespace="MyNameSpace"/> 
    </namespaces> 

und voila !!

+0

Link zur Dokumentation http://msdn.microsoft.com/en-us/library/ms164642.aspx und Beispiel:

0

Die Namespace-Deklaration ist unterhalb des Seitenelements in der Datei web.config wie dies getan:

<pages styleSheetTheme="Default"> 
     <namespaces> 
     <add namespace="MyNamespace"/> 
     </namespaces> 
6

andere Lösung, die es für mich gelöst (was zu Patriks ähnlich ist), ist nur den Namensraum importieren auf dieser spezifischen Steuerungs- oder Aspx-Seite.

Diese Lösung war mit meinem Problem besser geeignet, da die Erweiterungsmethoden nur für eine Klasse in der einen Kontrolle verwendet wurden.