0

私は次の文字列拡張メソッドを持っています:

public static string Truncate(this string value, int maxLength = 75)
{
    /* ... */
}

ビューで使用したいのですが、リテラル文字列で正しく機能します。しかしobject、ViewBagにモデルインスタンス(これを呼びましょう)がTruncateあり、その文字列プロパティの1つを試してみると、次のようになりますRuntimeBinderException

「string」には「Truncate」の定義が含まれていません

なぜそれが起こるのですか?それを修正できますか?

ありがとう。

4

2 に答える 2

4

ViewBagはタイプであるため、dynamic最初に適切なタイプにキャストしない限り、拡張メソッドはそのプロパティで取得されません。

例えば:

@(((string)ViewBag.stringProperty).Trunctate())

個人的には、 (他の理由の中でもViewBag)どこにでもキャストする必要がないように、の使用を制限しています。代わりに、ビューごとに強く型付けされたビューモデルを使用します。


完全を期すために、拡張機能を含む名前空間がビューで参照されていない場合にも、このエラーが発生する可能性があります。

ビューフォルダにあるweb.configに名前空間を追加できます。

ここに画像の説明を入力してください

次のセクションに名前空間を追加します。

  <system.web.webPages.razor>
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <pages pageBaseType="System.Web.Mvc.WebViewPage">
      <namespaces>
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Optimization"/>
        <add namespace="System.Web.Routing" />
        <add namespace="MyProject.Extensions" />
      </namespaces>
    </pages>
  </system.web.webPages.razor>

または、かみそりビュー自体に名前空間をインポートすることもできます。

@using MyProject.Extensions
于 2013-03-21T16:32:12.753 に答える
0

私は(きれいな)のようなことをします

@{
    string areaName = ViewBag.AreaName;
}

それから... <h4>@areaName.ExtensionMethod()</h4>

于 2015-05-23T17:07:58.580 に答える