0

この質問は簡単なものです。ページに一連のリンクがあり、それらはすべて実際には同じコントローラー メソッドを指しています。それらの違いは、それぞれがそのメソッドに異なる値を渡すため、後続のプロセスがわずかに異なることです。たまたま、渡された可能な値に対応する列挙型がすでに定義されていたので、何も考えずに次のようにしました。

@Url.Action("QueryStepTwo", new { type = QueryType.UserRecords })

そして、何も赤い下線が引かれていないことに驚きました。コンパイルを押してそのページに移動して確認すると、CS0103 のエラー メッセージが表示されました。「名前 'QueryType' は現在のコンテキストに存在しません」。エディターでQueryTypeは、構文が強調表示され、入力時に IntelliSense によってオプション リストが提供されます。

これは、VS/IntelliSense が少し賢すぎて、実際のページ解析/レンダリング エンジンではできないことを知っているだけの場合だと思いますか? 列挙型をその文字列または int 値にキャストしても役に立たないので、これは物事が実行される順序に関係していると推測しています。より具体的には、Razor がページを表示するまでに、列挙型は範囲外になります。このような URL ヘルパーで列挙型を使用する方法はありますか?特に、列挙型をビュー モデルのメンバーとして定義する必要がないものはありますか? あちこちで魔法の糸を使うのは嫌いです。タイプミスやばかげたことに対して脆弱すぎます。

4

1 に答える 1

2

この列挙型が定義されている名前空間を完全に修飾してください。

@Url.Action("QueryStepTwo", new { type = SomeNamespace.QueryType.UserRecords })

または、それをしたくない場合は@using 、Razor ビューの上部にディレクティブを追加することもできます。

@using SomeNamespace

そして、これをすべての Razor ビューに対してグローバルに実行する場合は、この名前空間を<namespaces>ノードに追加できます~/Views/web.config( と混同しないでください~/web.config)。

<system.web.webPages.razor>
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=3.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.Routing" />

        <add namespace="SomeNamespace" />
      </namespaces>
    </pages>
</system.web.webPages.razor>

Razor ビューの Intellisense に関する限り、これは信頼できるものではありません。マイクロソフトが将来のバージョンで改善することを願っています。

于 2013-02-20T15:13:15.627 に答える