12

私は int 型に単純な拡張メソッドを持っているので、次のことができます:

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

これはコードではうまく機能しますが、リピーター テンプレートでこの拡張メソッドを使用したいと考えています。データバインドするときは、次のことを行います。

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

それはうまくいかなかったので、私は試しました:

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

それでもうまくいきませんでした。JIT コンパイラは拡張メソッドを認識していませんが、ページには適切なインポート ステートメントがあります。

これを解決するための私の唯一のアイデアは、Eval を Literal コントロールに置き換えて、コード ビハインドで拡張メソッドを呼び出すことですが、いずれにせよ、これが機能しない理由を知りたいと思います。

ありがとう

4

5 に答える 5

9

私は同じ問題を抱えていましたが、最終的に解決策を見つけました。

私の場合、Extensionmethod クラスの名前空間をインポートするのを忘れていました。コード ビハインド ページには名前空間が含まれていましたが、aspx ページには含まれていませんでした。

web.config ファイルに名前空間を追加しました。

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

そして出来上がり!

于 2009-01-28T08:42:47.473 に答える
6

自分の質問に答えられるようです!Asp.Netは、.Net 2.0コンパイラを使用して.aspx、.ascxテンプレートをコンパイルしていました。それを機能させるには、web.configに以下を追加する必要がありました

  <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>

私はまだEvalで(int)へのキャストを実行する必要がありますが、それは少なくとも私には理にかなっています。

于 2008-12-16T19:49:23.470 に答える
6

私のためにそれを解決した別の解決策(Patrikのものに似ています)は、その特定のコントロールまたはaspxページに名前空間をインポートすることです。

<%@ Import Namespace="My.Namespace.Containing.MyExtensions.Class" %>

拡張メソッドは 1 つのコントロールで使用されるクラスのみを対象としていたため、この解決策は私の問題により適していました。

于 2010-02-24T11:13:06.947 に答える
0

Eval( "LengthInSeconds")はそれ自体で機能しますか?

于 2008-12-16T19:48:34.703 に答える
0

名前空間の宣言は、次のように web.config ファイルの pages 要素の下で行われます。

<pages styleSheetTheme="Default">
      <namespaces>
        <add namespace="MyNamespace"/>
      </namespaces>
于 2009-01-28T08:44:13.337 に答える