0

Ajax を使用してビューから Web Api コントローラー メソッドを呼び出そうとしています。ビューからの私の ajax 呼び出しは次のとおりです。

function loginuser() {
    var name = $("#txt_usrname").val();
    var pass = $("#txt_password").val();
    var source = {
        'username': name,
        'password': pass,
    }
    $.ajax({
        type: "POST",
        dataType: "json",
        data: source,
        url: 'api/Login', // url of Api controller not mvc
        success: function (data) {
              if(data.redirect)
                alert("Redirect true !");

        },
        error: function (XMLHttpRequest, textStatus, errorThrown) {
            console.log(errorThrown);
        }
    });

}

次のシナリオを除き、どのビューからでも API コントローラーを呼び出すことができます。

次のようにwebconfigでログインURLを設定した後

<authentication mode="Forms">
      <forms loginUrl="~/Account/Login" path="/" defaultUrl="~/Home/Index" name=".ASPXFORMSAUTH" timeout="2880"/>
    </authentication>

~/Account/Login は MVC コントローラーを指します。~/Account/Login ビューから ajax を使用して api コントローラーを呼び出すと、ajax 呼び出しは Api コントローラー api/Login ではなく MVC コントローラー ~/Account/Login にマップされます。しかし、web.config から「authentication」タグを削除し、アカウント/ログインをデフォルト ビューとしてロードすると、ajax 呼び出しは期待どおりに API コントローラーにマップされます。

ajax 呼び出しで URL を変更しようとしましたが、url が何であれ、ajax 呼び出しは、url として指定しているコントローラー名ではなく、常に MVC コントローラーにマップされます。

これは、認証タグ内の Loginurl ビューでのみ発生します。認証タグを削除して、他のビューで ajax 呼び出しを使用すると、正常に動作します。

誰かがこの問題に遭遇しましたか?, 明らかなことを見逃している場合は申し訳ありません, しかし、私はこれに何時間も立ち往生しています...

プロジェクトは Phonegap で使用されるため、すべてのアクションを MVC ではなく Api controllers で処理する必要があります。

答えでなくても、どんな助け、アドバイスも大歓迎です...

前もって感謝します。

これが私のルートテーブルです

 routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );

および webApiConfig の場合

config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
4

1 に答える 1

0

私が使用した認証は、loginUrl として使用されるもの以外のコントローラー メソッドの呼び出しを制限します。したがって、Account\login 以外のコントローラーへのすべての参照は、Account\login 自体にマップされます。

この問題を解決するために、コントローラーで [authorize] 属性を使用しました。

于 2013-09-13T02:08:49.753 に答える