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呼び出しにヒットし、それをステップオーバーしてもコントローラーに到達せず、エラーも発生しません。何か案は?
主な問題はここにあります-
url: "~/Controllers/CustomerController/GetImage/",
ご覧のとおり、~
はサーバー側のリテラルです。つまり、これをASP.netサーバー側のパスで使用すると、現在のサーバーアプリケーションフォルダーの場所に置き換えられます。これは、従来のASP.Netの方法でした。この行には2つのエラーがあります-
このURLは機能しません。 JSの文字列内にあるため、ASP.netはそれをサーバーパスに置き換える必要があることを認識していません。 ASP.netがそれを検出して変換できたとしても、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);
}
あなたのajaxスクリプトは、POSTアクションメソッドを探していると言っています。
$.ajax({type: 'POST',
アクションメソッドをPOSTで装飾しましたか?
[HttpPost]
public JsonResult GetImage(string url)
{
}
また、ajaxデータパラメーターを調整します
$.ajax({
data: {
"url": url
},
chromeを使用している場合は、開発ツール->ネットワークタブに移動して、行われているすべてのサーバーリクエストを確認できます。ボタンを押すと、ポップアップが表示され、応答コードが表示されます。ヘッダーなど。あなたの場合は赤になり、何が悪かったのかがわかります
Web APIを使用している場合...メソッドは「Get」GetImagesで始まるため、メソッドを[HttpPost]
で装飾する必要があります。
MVCで何が起こっているかを確認するには、フィドラーを使用するのが最善の方法であることがわかりました。
Fiddlerを起動し、コードを再度実行して、実際に何が戻ってきたかを確認します。最も可能性が高いのは(Yorroが述べたように)、404エラーが発生し、json呼び出しでエラー処理が行われていないため、エラーが表示されないことです。
動作する場合と動作しない場合があるため、静的などの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();
}
});
うまくいけば、このコードはあなたの問題を解決するでしょう!
$.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();
}
});
IEを使用していて、コントローラーが最初にヒットする場合は、追加するだけです...
$ .ajax({cache:false、.。