0

ASP.NET MVC プロジェクトで奇妙なルーティングの問題が発生しました。皆さんの助けが必要です。

プロジェクトをローカルホストから実行するか、サーバーで直接展開しているときに実行すると、全体的にすべてが正常に機能しますhttp://myServerName。異なる仮想ディレクトリの下にあるサーバー上のさまざまな環境にアプリケーションをデプロイすると、問題が発生します。例:http://myServerName/QaEnviornmentまたはhttp://myServerName/TestEnviornment

問題は、アプリケーション URL へのすべての Javascript 呼び出しが、環境の仮想ディレクトリを無視して失敗することです。たとえば、私の QA サーバーでは、Ajax 呼び出しを行う必要があるときはいつでも、次のような標準的なアプローチをとっています。

var myUrl = '/ControllerName/ActionMethodName/'
$.ajax({url:myUrl,success:function(){Do stuff} })

私のアプリケーションは にデプロイされているため、http://myServerName/QaEnviornmentレンダリングすると myUrl が になると予想されますhttp://myServerName/QaEnviornment/ControllerName/ActionMethodName。代わりに戻ってきてas http://myServerName/ControllerName/ActionMethodName、もちろん失敗します。

今のところこれを回避するために、環境フォルダー名を含むグローバル Javascript 変数を宣言しました。JavaScript 呼び出し用の URL を作成するときは、常にそれらを var として構築することを覚えておく必要があります。myUrl = myGlobalFolderVar + '/ControllerName/ActionMethodName/'

グローバルな JavaScript 変数を使用してこの問題を回避することは、私には悪い解決策のように思えます。JavaScript 呼び出しが行われるたびに、アプリケーションが実行されているサブフォルダーが常に URL に含まれるように、ルーティングを適切に機能させるためにできることはありますか?

4

1 に答える 1

1

URL を正しく構築することを常に忘れないようにする代わりに、URL を作成するために呼び出すヘルパー関数を作成します。

function CreateUrl(string path){
    return myGlobalFolderVar + path;
}

2番目の質問に答えるには、そうではありません。ルーティングはリクエストの原因を認識していないため、X-Http-RequestedWithその決定に基づいてヘッダーに常に依存できるとは限りません。さらに、サイト アプリケーション ルートはドメイン ルートにないため、ルーティングはアプリケーションにアクセスしたときにのみ開始されます。私が知っている他の唯一の方法は、MVC に実際に URL を生成させることですが ( var url = '@Url.RouteUrl(params)';)、JavaScript が 1 つまたはいくつかの .js ファイルにある場合、これはまったく役に立ちません。

編集

上記の関数は、外部 JS ファイルを含め、アプリケーション内の任意の場所に配置できる JavaScript 関数です。myGlobalFolderVar の設定に関しては、これを設定する方法がいくつかあります。

1.外部JSファイルに変数を実際にハードコーディングします。

var myGlobalFolderVar = 'TestEnviornment';

ただし、複数の異なるテスト サーバーに展開する場合、これは困難です。

2.web.config 変換を使用している場合は、ビルド タイプに応じて、web.config 変換に AppSettings キーと値のペアを追加できます。次に、その値を使用して、グローバル Javascript 変数をマスター ページのレイアウト/ビューに設定します。

  <appSettings xdt:Transform="Replace">
    <add key="folderLocation" value="TestEnvironment" />
  </appSettings>

外部 JS ファイル内

//this makes it a site wide/global variable in any place you 
//include your external JS file
    var myGlobalFolderVar = '';

そしてあなたのマスタービューで

<script type="text/javascript">
   myGlobalFolderVar = '@ConfigurationManager.AppSettings["folderLocation"]'
</script>

3. 2 番目と同じですが、web.config 変換を使用する代わりに、URL ヘルパーを使用して、アプリケーションへのパスがマスター ビューにあることを確認します。

<script type="text/javascript">
    myGlobalFolderVar = '@Url.Content("~/")'
</script>

基本的な考え方は、.NET を使用してそれが存在する場所を特定し、そのパス情報を使用してグローバル JavaScript 変数を設定することです。次に、この回答の冒頭で提供されているヘルパー JavaScript 関数と組み合わせて、パスの深さ、展開場所、またはその他の展開の種類の問題に関係なく、アプリケーション全体で必要に応じてパスを正しく生成できます。

var myUrl = CreateUrl('/ControllerName/ActionMethodName/');
$.ajax({url:myUrl,success:function(){Do stuff} });
于 2012-10-26T22:35:28.627 に答える