11

jsファイルでUrl.Action()メソッドを使用して、ajax呼び出しのURLを定義しようとしています。これまでのところ私は失敗しました。

 $.ajax(
 {
    type: "POST",
    url: '@Url.Action("SomeAction", "SomeController")',
    data: { 
        fileID: rightClickedFileId
    },
    success: function (data) {

    }
 });

この方法でURLを定義すると、ブラウザはデータをに投稿しようとします

http://localhost:5907/FileManager/@Url.Action(%22SomeAction%22,%20%22SomeController%22)

その結果、私のajax呼び出しは失敗します。

ただし、'/SomeController/SomeAction'代わりに使用すると、すべてが正常に機能します。

2番目は問題ありませんが、最初の問題はどうでしょうか。ルーティング構成が原因である可能性がありますか?

ありがとう。

4

4 に答える 4

21

Url.Actionは、外部のjavascriptファイルではなく、かみそりのビューで機能するhtmlヘルパーメソッドです。

できることは、Url.Actionかみそりのビューでヘルパーメソッドを使用してアクションメソッドへの相対URLを取得し、それをjavascript変数に設定して、外部jsファイルで使用することです。これを行うときは、既存のグローバル変数との競合を避けるために、常にjavascript名前空間を使用してください。

このコードは_Layout.cshtmlに追加できます

<script type="text/javascript">

    var yourApp = yourApp || {};
    yourApp.Urls = yourApp.Urls || {};
    yourApp.Urls.baseUrl = '@Url.Content("~")';
    yourApp.Urls.editUserUrl= '@Url.Action("Edit","User")';

</script>

または、ページ固有のビューで、

@section Scripts
{
  <script type="text/javascript">

     var yourApp = yourApp || {};
     yourApp.Urls = yourApp.Urls || {};
     yourApp.Urls.baseUrl = '@Url.Content("~")';
     yourApp.Urls.editUserUrl= '@Url.Action("Edit","User")';

  </script>
  <script src="~/Scripts/PageSpecificExternalJsFile.js"></script>    
}

これで、外部のjavascriptファイルで、次のようにアクセスできます。

var urlToEditUser = yourApp.Urls.editUserUrl;
//you can use urlToEditUser  now

// Or With the base url, you may safely add the remaining part of your url.
var urlToEditUser2 = yourApp.Urls.baseUrl+"User/Edit";
//you can use urlToEditUser2  now

常にUrl.ActionまたはUrl.RouteUrlhtmlヘルパーメソッドを使用して、アクションメソッドへの相対URLを作成します。現在のページ/パスに関係なく、URLを正しく構築します。

角度コントローラーやデータサービスなどで同じことをしたい場合は、角度値プロバイダーを使用して同じことを行う方法を説明しているこの投稿をご覧ください。

于 2012-09-20T14:36:42.160 に答える
7

'@Url.Action("SomeAction", "SomeController")'これはASP.NETMVCヘルパーであるため、jsファイルでは使用できません。コードをビューに配置すると、すべてが機能します。

于 2012-09-20T14:32:55.137 に答える
1

私のアプローチは@Shyjuのアプローチと似ていますが、Razorビューで1つの変数を設定する代わりにinit、JavaScriptで関数を呼び出し、Razorで解釈する必要のあるすべてのパラメーターを渡します。

したがって、コードは次のようになります。

MyScript.init({
    editUserUrl: "@Url.Action("Edit","User")",
    anotherUrl: "@Url.Action("AnotherUrl", "User")"
})

次にJavaScriptで:

var m_options;
MyScript.init = function(options) {
    m_options = options;
}

// use with m_options.editUserUrl here
$.ajax(
{
    type: "POST",
    url: m_options.editUserUrl,
    data: { 
        fileID: rightClickedFileId
    },
    success: function (data) {
    }
 });

私はここにそれについてのより詳細な投稿を書きました:http: //blog.blanklabs.com/2015/02/aspnet-mvc-refactoring-friendly.html

于 2015-02-01T23:58:27.753 に答える
1

このように書くことができます

url:'/controllername/Actionname',
于 2017-03-31T10:27:12.327 に答える