从 JavaScript 向不同文件夹中的 C# 控制器进行 ajax 调用

Posted

技术标签:

【中文标题】从 JavaScript 向不同文件夹中的 C# 控制器进行 ajax 调用【英文标题】:Make an ajax call from JavaScript to C# controller in a different folder 【发布时间】:2021-08-10 23:17:20 【问题描述】:

问题底部的更新说明

我在进行从 javascript 到 C# 控制器的 AJAX 调用时遇到问题。我很确定我的问题是我对 javascript 文件的 AJAX 调用的连接 url。如果连接 url 不是问题,那么我认为这可能是我的 C# 控制器中的问题。我知道 jQuery 已正确加载,因为我能够在 RunDemo 函数中的 AJAX 调用之前控制日志信息。

以下是对我要完成的工作的解释:

我有一个带有一个按钮的简单 html 页面。单击按钮时,我需要对我的 c# 控制器进行 ajax 调用并检索一个字符串。在 AJAX 成功后,我会在 html 页面上提醒用户从 C# 控制器检索到的消息。这是我的“TheDemo”存储库的图片:

这是我的“索引”html 页面:

<!DOCTYPE html>
<html>
<head>
  <title>The Demo</title>
  <script type="text/javascript" src="../Scripts/jquery-3.6.min.js"></script>
  <script type="text/javascript" src="../Scripts/demo.js"></script>
</head>
<body>
    <div class="demo-container">
        <h1>Demo</h1>
        <button type="button" id="SubmitButton">Submit</button>
    </div>
</body>
</html>

这里是 "demo.js" javascript 文件:

//Function makes an ajax to the controller
function RunDemo()
    $.ajax(
        url: '/Demo/RunDemo',
        type: 'POST',
        dataType: 'json',
        success: function (retData)
        
            console.log(retData);
            alert(retData.Message);
        ,
        error: function (retData)
        
            console.log(retData);
        
    );


//Event handles the "Submit" button
$(document).on("click", "#SubmitButton", function () 
    RunDemo()
);

这里是“DemoController.cs”C#文件:

using System;

class DemoController : Controller

    [HttpPost]
    public JsonResult RunDemo()
    
        object obj = new  Message = "Return From Controller" ;
        return Json(obj, JsonRequestBehavior.AllowGet);
       

这是我在 Google Chrome 控制台中的错误图片:

更新:

我已经修复了 ajax 连接 url。还是不行,我已经更新了谷歌浏览器控制台的镜像。

更新 2:

我注意到这可能是我打开文件的方式。目前,我正在使用 Google Chrome 检查器打开 html 页面。我不是在 Visual Studio 代码中“运行”一个进程。我需要在什么地方托管 C# 控制器吗?

谢谢!

【问题讨论】:

控制器的 url 由路由定义,而不是由名称定义。默认路由使用名称,因此可能看起来像名称一样,但您可以在不更改名称的情况下更改路由。 【参考方案1】:

您的 AJAX URL 与您的 HTML 文件相关,该文件本身位于您的本地磁盘上。因此,它不会转到您的控制器,它可能在 localhost 上运行,而是根据错误消息转到 file:///Demo/RunDemo

AJAX 请求最好通过浏览器开发工具的“网络”选项卡进行调试。

tl;dr -- 通过您的 ASP.NET 应用程序托管的 URL 调用您的页面。应该是http://localhost/View/index.html

【讨论】:

哦,这可能是问题所在。我正在打开 html 文件,通过“使用谷歌浏览器打开”,我没有“运行任何东西”我需要做一些不同的事情吗? 好吧,您需要运行 ASP.NET MVC 应用程序才能响应您的 AJAX 请求。 哦,我认为这可能是问题所在!我以为我可以自己打开html文件。谢谢您的帮助!目前我无法再进行任何更改。但我会在大约 4 小时后报告。非常感谢您的帮助!【参考方案2】:

您为 ajax 调用指定的 url 不正确。在 ASP.NET mvc 中,我们只指定了没有控制器后缀的控制器名称,并且 url 的格式也不正确。尝试以下网址:

url: '/Demo/RunDemo'

【讨论】:

您好,感谢您的回复!不幸的是,它并没有奏效,我用新的控制台错误更新了原始问题,并添加了我最初没有提到的其他内容。谢谢!【参考方案3】:

修复你的 ajax 文件

$.ajax(
        url: '/Demo/RunDemo',
        type: 'POST',
        success: function (retData)
        
            console.log(retData);
            alert(retData.Message);
        ,
        error: function (retData)
        
            console.log(retData);
        
    );

【讨论】:

您好,感谢您的回复!它不太奏效,我用新的控制台错误更新了原始问题,并添加了我最初没有提到的其他内容。再次感谢!【参考方案4】:

嗯,您的问题不在于 AJAX 调用,而在于后端的 CORS 权限,以确保跨源资源共享的系统安全。您会看到,即使它允许同一 URL 上的资源,但您的浏览器会阻止来自不同 URL 的所有资源。

    using System;
    using System.Web.Http.Cors;
    class DemoController : Controller
    
      [EnableCors(origins: "http://yourlocalhost:", headers: "*", methods: "*")]
      [HttpPost]
      public JsonResult RunDemo()
    
        object obj = new  Message = "Return From Controller" ;
        return Json(obj, JsonRequestBehavior.AllowGet);
       

如果上面的代码没有帮助,请尝试查看此文档:

https://docs.microsoft.com/en-us/aspnet/web-api/overview/security/enabling-cross-origin-requests-in-web-api

【讨论】:

以上是关于从 JavaScript 向不同文件夹中的 C# 控制器进行 ajax 调用的主要内容,如果未能解决你的问题,请参考以下文章

如何使用javascript从数据库中向动态表中添加不同的列

将数组从 JavaScript 传递到 C# 的最佳方法?

如何从 javascript 中的 C# HttpResponseMessage 读取内容?

如何从 .cs 文件 (C#) 调用 JavaScript/jQuery 函数

如何使用 c# 从 Windows 窗体向用户显示默认的 Windows 身份验证提示?

3 尝试使用 C# 删除 XML 节点