C# Asp.net MVC Ajax调用不调用控制器方法
我正在制作一个ASP.net MVC应用程序,我希望这样,当用户单击链接时,它会执行一个ajax调用,将数据发送到控制器,然后将其他数据返回到视图 这是我想在控制器中调用的方法:C# Asp.net MVC Ajax调用不调用控制器方法,c#,jquery,asp.net,ajax,asp.net-mvc,C#,Jquery,Asp.net,Ajax,Asp.net Mvc,我正在制作一个ASP.net MVC应用程序,我希望这样,当用户单击链接时,它会执行一个ajax调用,将数据发送到控制器,然后将其他数据返回到视图 这是我想在控制器中调用的方法: public JsonResult GetImage(string url) { Image image = Image.FromFile(url, true); byte[] byteImage = converter.ImageToBytes(ima
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调用,然后跳过它,它永远不会到达控制器,也不会给出任何错误。
有什么想法吗?您的ajax脚本说它正在寻找一种后期操作方法
$.ajax({type: 'POST',
你有没有用贴子装饰动作法
[HttpPost]
public JsonResult GetImage(string url)
{
}
另外,调整ajax数据参数
$.ajax({
data: {
"url": url
},
如果你使用的是chrome,你可以进入开发者工具->网络选项卡,查看所有的服务器请求。点击按钮,您将看到它弹出,并显示响应代码、标题等。在您的情况下,它将是红色的,并将告诉您出现了什么问题,如果您使用的是web api。。。你的方法是从“Get”GetImages开始的,因此你需要用
[HttpPost]
来修饰这个方法。我发现使用fiddler是查看MVC中发生了什么的最好方法
启动fiddler,再次运行代码,看看实际返回了什么。最有可能的情况是(正如Yorro所提到的)您遇到了404错误,并且由于您在json调用中没有错误处理,因此您永远不会看到错误。主要问题在于-
url: "~/Controllers/CustomerController/GetImage/",
您可以看到,~
是一个服务器端文本,换句话说,当您在ASP.net服务器端路径中使用它时,它将被当前服务器应用程序文件夹位置替换。这是传统的ASP.Net方式。此行有2个错误-
Global.asax
),然后将该路由用作此处的url。默认情况下,MVC应用程序将支持以下格式-
/{controller}/action
示例-
'localhost/Home/Index`
HomeController
,因为默认情况下,控制器应该忽略尾部字符串Controller
我希望这对你有所帮助,如果你正在为你目前的情况寻找解决方案,试试这个(我还没有测试过,但应该是这样的)——
但为了安全起见,请确保使用-
[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);
}
如果使用IE,并且你的控制器在第一次点击时只添加 $.ajax({ cache:false,
…有时它会起作用,有时不起作用,所以不要提及静态的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();
}
});
希望这个代码能解决你的问题!!< /P>你在JavaScript中真的有<代码>“/控制器/……/代码>吗?你的路线图包括<代码> /{控制器}/{Actudi}…<代码>路由吗?或者你假设JavaScript /HTML中的页面相对URL会被转换成站点相对URL?考虑使用一些HTTP调试工具。(像Fiddler)查看请求的确切外观,并查看您是否希望服务器处理它。+0:您需要说“如果您正在使用WebAPI。。。“,这在问题的任何地方都没有提到。装饰是可选的。在这种情况下,MapRoute应该是什么样子?您好,欢迎使用SO。请不要只是将代码作为答案,解释您的想法,以便用户更好地了解发生了什么。谢谢。
$.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();
}
});
$.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();
}
});