web-dev-qa-db-ja.com

Asp.net MVCAjax呼び出しがコントローラーメソッドを呼び出さない

ASP.net MVCアプリケーションを作成しています。ユーザーがリンクをクリックすると、ajax呼び出しが実行され、データがコントローラーに送信されてから、他のデータがビューに返されます。

これは、コントローラーで呼び出したいメソッドです。

public JsonResult GetImage(string url)
        {
            Image image = Image.FromFile(url, true);

            byte[] byteImage = converter.ImageToBytes(image);

            return Json(new { byteImage }, JsonRequestBehavior.AllowGet);
        }

そして、ここにコントローラーの場所があります:

08983ClassLibrary\EpostASP\Controllers\CustomerController.cs

これは私のAjaxコールです:

$.ajax({
            url: "~/Controllers/CustomerController/GetImage/",
            type: 'POST',
            contentType: 'application/json',
            data: "url="+url,
            success: function (image) {
                document.getElementById("image").src = "data:image/png;base64," + image;
                showImage();
            }
        });

コードにブレークポイントを配置すると、ajax呼び出しにヒットし、それをステップオーバーしてもコントローラーに到達せず、エラーも発生しません。何か案は?

5
brian4342

主な問題はここにあります-

url: "~/Controllers/CustomerController/GetImage/",

ご覧のとおり、~はサーバー側のリテラルです。つまり、これをASP.netサーバー側のパスで使用すると、現在のサーバーアプリケーションフォルダーの場所に置き換えられます。これは、従来のASP.Netの方法でした。この行には2つのエラーがあります-

  1. このURLは機能しません。 JSの文字列内にあるため、ASP.netはそれをサーバーパスに置き換える必要があることを認識していません。 ASP.netがそれを検出して変換できたとしても、2番目のエラーが発生します。それでも機能しません。私が2-で説明した点のために

  2. ASP.net MVCを使用しているため、これは適切な方法ではありません。より一般的なMVCの方法は、ルートを作成してそれらのルートを使用することです。 ASP.netでは、ページ(.aspx、.ascx)に直接リンクするオプションがあるためです。ただし、MVCコントローラーのアクションをそのようにリンクすることはできません。したがって、ルート構成でルートを作成し(Global.asaxを確認)、そのルートをここのURLとして使用する必要があります。デフォルトでは、MVCアプリは次の形式をサポートします-

    <Host>/{controller}/action

    例-

    'localhost/Home/Index`
    

デフォルトでは、コントローラーは末尾の文字列HomeControllerを無視することになっているため、Controllerを記述しなかったことに注意してください。

これがお役に立てば幸いです。現在の状況の解決策を探している場合に備えて、これを試してください(テストはしていませんが、次のようになっているはずです)-

 $.ajax({
        url: "Customer/GetImage",
        type: 'POST',
        contentType: 'application/json',
        data: "url="+url,
        success: function (image) {
            document.getElementById("image").src = "data:image/png;base64," + image;
            showImage();
        }
    });

しかし、安全のために、必ず使用してください-

[HttpPost]
public JsonResult GetImage(string url)
{
}

更新:maproute(コメントで要求されている)は、これらのルートのいずれでも機能します。ただし、さまざまなルート構成で機能することもできます。ルート設定は非常に柔軟です。ルートを適切に設定するだけです。 -

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.MapRoute(
            "...",                                              // Route name
            "{controller}/{action}/{id}",                           // URL with parameters
            new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
        );

        routes.MapRoute(
            "...",                                              // Route name
            "{controller}/{action}",                           // URL with parameters
            new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
        );

        routes.MapRoute(
            "...",                                              // Route name
            "{controller}/{action}/{id}",                           // URL with parameters
            new { controller = "Customer", action = "GetImage", id = "" }  // Parameter defaults
        );
        routes.MapRoute(
            "...",                                              // Route name
            "Customer/GetImage/{id}",                           // URL with parameters
            new { controller = "Customer", action = "GetImage", id = "" }  // Parameter defaults
        );
        ..... //all of these mentioned route will land on the same url 
    }

    protected void Application_Start()
    {
        RegisterRoutes(RouteTable.Routes);
    }
13
brainless coder

あなたのajaxスクリプトは、POSTアクションメソッドを探していると言っています。

$.ajax({type: 'POST',

アクションメソッドをPOSTで装飾しましたか?

[HttpPost]
public JsonResult GetImage(string url)
{
}

また、ajaxデータパラメーターを調整します

$.ajax({
    data: {
        "url": url 
        },
4
Yorro

chromeを使用している場合は、開発ツール->ネットワークタブに移動して、行われているすべてのサーバーリクエストを確認できます。ボタンを押すと、ポップアップが表示され、応答コードが表示されます。ヘッダーなど。あなたの場合は赤になり、何が悪かったのかがわかります

3
BrendanMcKee

Web APIを使用している場合...メソッドは「Get」GetImagesで始まるため、メソッドを[HttpPost]で装飾する必要があります。

0
zero7

MVCで何が起こっているかを確認するには、フィドラーを使用するのが最善の方法であることがわかりました。

Fiddlerを起動し、コードを再度実行して、実際に何が戻ってきたかを確認します。最も可能性が高いのは(Yorroが述べたように)、404エラーが発生し、json呼び出しでエラー処理が行われていないため、エラーが表示されないことです。

0
MercifulGiraffe

動作する場合と動作しない場合があるため、静的などのURLについては言及しないでください"〜/ Controllers/CustomerController/GetImage /"動的な方法に従ってください

したがって、以下のようなコードスニペットを変更します

$.ajax({
        url: "@Url.Action("GetImage", "CustomerController")",
        type: 'POST',
        contentType: 'application/json',
        data: "url="+url,
        success: function (image) {
            document.getElementById("image").src = "data:image/png;base64," + image;
            showImage();
        }
    });

うまくいけば、このコードはあなたの問題を解決するでしょう!

0
Ankit Bharti
$.ajax({
     url: '@Url.Action("GetImage", "Customer")',
    type: 'POST',
   contentType: "application/json; charset=utf-8",
    data: "url="+url,
    success: function (image) {
        document.getElementById("image").src = "data:image/png;base64," + image;
        showImage();
    }
});
0
Sk Asraf

IEを使用していて、コントローラーが最初にヒットする場合は、追加するだけです...

$ .ajax({cache:false、.。

0
Kenmeister