C# 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

我正在制作一个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调用,然后跳过它,它永远不会到达控制器,也不会给出任何错误。
有什么想法吗?

您的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个错误-

  • 这个url永远不会工作。因为它在JS中是一个字符串,所以ASP.net不知道必须用服务器路径替换它。现在是第二个错误,即使ASP.net可以检测并转换它,它仍然无法工作。由于我在第2节中所述的观点——

  • 因为您使用的是ASP.net MVC,所以这不是一个好的实践。更传统的MVC方法是创建路由并使用这些路由。因为在ASP.net中,您可以选择直接链接到页面(.aspx、.ascx)。但是MVC控制器的动作不能像那样链接。因此,您必须在路由配置中创建路由(选中
    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();
            }
        });