6

何度試しても、HTML Helper 拡張メソッドが機能しません。誰かが自分で試してみたい場合は、私が作成したテスト手順を次に示します。

  1. Visual Studio 2012 を使用して、「インターネット アプリケーション」プロジェクト テンプレートを使用して、新しい「Visual Basic ASP.NET MVC 4 インターネット Web アプリケーション」を作成します。

  2. フォルダを作成します"~/Views/Helpers"

  3. ファイルを作成し"DisplayForPropertyHelper.vb"、次のコードを追加します。

    Namespace TestProject.Extensions
        Public Module HtmlHelperExtensions
            <Extension()>
            Public Function DisplayForProperty(helper As HtmlHelper) As MvcHtmlString
                Return MvcHtmlString.Create("TEST")
            End Function
        End Module
    End Namespace
    
  4. 以下を開いて"~/Views/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="TestProject.Extensions"/>
          </namespaces>
        </pages>
    </system.web.webPages.razor>
    
  5. プロジェクトをコンパイルする

  6. ANY razor ビュー ファイルを選択し、「-」と入力@Html.Displayすると、拡張メソッドが表示されないことがわかります。

  7. Razor ビュー ファイルに追加し、ファイル@Imports TestProject.Extensionsを保存して閉じます。

  8. ファイルを再度開いて - と入力@Html.Displayすると、拡張メソッドが表示されないことがわかります。

  9. VS2012 を閉じて、プロジェクトを再度開くこともできます。違いはありません。

私は何週間もこれと戦ってきました。ここや他の場所で私が見つけたすべての答えは何の助けにもなりません。誰かが答えを持っているはずです。

4

2 に答える 2

10

名前空間にアプリケーション名のプレフィックスを付けたことを確認してください。たとえば、作成したアプリケーションが呼び出さMvcApplication1れた場合は、次のように記述します~/Views/web.config

<add namespace="MvcApplication1.TestProject.Extensions"/>

だけでなく:

<add namespace="TestProject.Extensions"/>

ええ、私はそれがVB.NETのものの1つであると思います:-)ああ、~/Views/web.configファイルに変更を加えた後、Razorビューを閉じて開くことを忘れないでください。そうしないと、変更がすぐに反映されません(アプリケーションを実行すると、もちろん動作します)。

于 2013-02-06T06:45:48.943 に答える
4

これは実際には答えではありませんが、全体像を (少し) 追加することを期待してここに書きます。

私にとっては、「モジュール」クラスが「パブリック」として明示的に変更されていないことを発見しました(修飾子を指定しない場合、デフォルトはフレンドであり、それが私のものを殺していました)

はい、OP の例のモジュールが既に Public として宣言されていることは認識していますが、自分のコード スタックでそれをキャッチできず、その要件を強調することにしました。過去 5 年間 VB.Netter をプレイしなければならなかったネイティブ C シャープパーとして、私は C# スニペットを手動で翻訳することにうんざりしており、コード コンバーターに頼る傾向があります。そのため、私が見つけて変換した気の利いた HtmlHelper は正しく表示されず、生成されたコード スニペットでこの問題を探すのを怠っていました。

以前のコメントで述べたように、私も合唱に参加して次のことを述べたいと思います。

  • 私は上記のすべてを行っていました(OPのチェックリストを何度も確認したので、そう思いました)

  • また、VB.NET MVC 4 (今日まで) で HtmlHelpers を作成することはほぼ不可能であることがわかりました。要件は、このような脆弱な方法でサポートされているようです。

  • また、MVC サイトの開発に VB.NET を使用しなければならないことも嫌いです (ただし、VB.NET と一緒に暮らす必要があります。これは、会社に引き継がれたレガシー コードの一部です)。

  • 私はそれを軽蔑していますが(このような理由で)、あなたがそれを理解するのに十分な決意を持っているなら、すべてがサポートされているように見えると言えます. (StackOverflow に感謝します!)

この発見の前は、アプリケーション名にドットが含まれていたため (MyCorp.Web.WorkOrders) と (MvcApplication1).. が機能していないのではないかと考えていましたが、テストの結果、アプリケーション名は問題ではないと結論付けられました。どちらに名前を付けても、うまくいきます。

繰り返しますが、@ Darin が既に指摘したように、views/web.config の「名前空間の追加」宣言の一部としてソリューション名 (スペース) を含める必要があります。

于 2013-12-11T17:58:29.717 に答える