【问题标题】:AJAX Call to MVC5 ActionResultAJAX 调用 MVC5 ActionResult
【发布时间】:2016-04-13 12:17:30
【问题描述】:

我正在尝试找出以下代码有什么问题:

$(".ReportScore").click(function () {
    $.ajax({
        type: "GET",
        url: "/events/Tournaments/ReportScore",
        success: function() {
            location.reload();
        },
        error: function() {
            alert("The scores were not recorded");
        }
    });
});

当我在栏中键入 url 时,它可以正常工作,但是当我尝试进行 ajax 调用时,我得到 404 Page not found 错误。

澄清一下,当我点击按钮时,我会弹出一个提示“分数未记录”的弹出窗口,而在开发人员工具上,我会收到一个脚本错误提示页面未找到。

我在可视化工作室中也有一个方法本身的断点,但该点永远不会被命中,因为该方法永远不会被调用。

服务器端代码:

public async Task<ActionResult> ReportScore()
{
    var a = "abc"
}

var 永远不会命中一行。

编辑:

我有另一个来自同一个脚本的 ajax 调用,没有问题:

$("#InvitedMember").autocomplete({
    source: function (request, response) {
        $.ajax({
            type: "POST",
            url: "/events/Teams/Members",
            data: { id: $("#InvitedMember").val() },
            success: function (data) {
                response($.map(data, function (item) {
                    return {
                        label: item.CustomUrl, value: item.CustomUrl
                    };
                }));
            }
        });
    },
    create: function () {
        $(this).data('ui-autocomplete')._renderItem = function (ul, item) {
            return $('<li>')
                .append("<a><div>" + item.label + "</div></a>")
                .appendTo(ul);
        };
    },
    select: function (event, ui) {
        //you can access ui.item to get the selected item object.
        $("#InvitedMember").val(ui.item.value);
        return false;
    }
});

【问题讨论】:

  • 请提供您的服务器端代码和您要使用浏览器的完整网址
  • 尝试将 [HttpGet] 属性添加到方法中。该方法位于哪个控制器中?检查它是否位于 Tournaments 而不是 TeamsController
  • @Nigrimmist get 属性没有帮助。

标签: javascript asp.net-mvc-5 asp.net-ajax


【解决方案1】:

这样硬编码你的网址不是一个好主意。您应该始终使用 Url.ActionUrl.RouteUrl html 辅助方法来构建您正在访问的操作方法/端点的相对 url。无论您当前的页面/路径如何,这些帮助方法都将负责正确构建 url。

另外,根据您的评论,似乎 events 是您的 IIS 中的虚拟目录/应用程序名称的名称您不应在代码中使用这些来构建网址,因为它可能会根据您的部署而改变。如果您想要一份部署到 "http://staging.yourSite.com" 的代码副本怎么办?

只要您使用Url.Action 辅助方法,它就会为您的应用构建正确的相对url,您无需担心您的IIS 虚拟目录/应用程序名称。

var url = "@Url.Action("ReportScore","Tournaments")";

$.ajax({
    type: "GET",
    url:url,
    success: function (res) {
        alert('success happened');
        //location.reload();
    },
    error: function () {
        alert("The scores were not recorded");
    }
});

如果您将上面的代码放在剃须刀视图中,它就可以工作。但是,如果您的 ajax 调用代码在外部 js 文件中,您可以将相对 url 构建到应用程序根目录并将其传递给您的 js 文件并使用它来构建 url。您可以使用@Url.Content("~") 构建应用程序根目录的 url。如果需要,您可以构建特定操作方法本身的 url。

<script>
    var myApp = myApp || {};  
    myApp.Urls = myApp.Urls || {};
    myApp.Urls.baseUrl = '@Url.Content("~")';   
    myApp.Urls.reportScoreUrl=  '@Url.Action("ReportScore","Tournaments")';  
</script>
<script src="~/Scripts/PageSpecificExternalJsFile.js"></script>

在您的PageSpecificExternalJsFile.js 文件中,您可以像这样阅读它

var myUrlToUser = myApp.Urls.reportScoreUrl;
alert(myUrlToUser);

或使用基本 url 构建。

var myUrlToUser= myApp.Urls.baseUrl+"Tournaments/ReportScore";
alert(myUrlToUser);

【讨论】:

  • 问题是,我有另一个运行良好的 ajax 调用,并且提供的 URL 是“事件/团队/成员”,这是团队控制器上的成员方法。我会更新问题给你看。
  • 事件是一个区域吗?还是您将其添加到您的路线定义中?
  • events 是您通过 IIS 访问我的网站的方式。示例:localhost/events/home/index
  • 这是您在 IIS 中的虚拟目录/应用程序名称。 您不应在代码中使用它,因为它可能会根据您托管它的方式而改变。只需使用控制器名称和动作名称,并使用辅助方法生成路径。
  • 您对事件是正确的/当我在调试模式下运行它时,URL 是 localhost:123/Tournaments/ReportScore 但是当我通过 IIS 运行它时它是 localhost/events/Tournaments/ReportScore 并且这使得完全不同。
【解决方案2】:

问题似乎不在于您的 javascript 代码,而在于您的控制器操作方法 (如果它确实是这样编写的)

public async Task&lt;ActionResult&gt; ReportScore() { var a = "abc" } 您的代码块没有显示任何返回语句,请确保等待您的返回值。 IE。 return await "abc"

【讨论】:

  • 有一个返回语句和更多代码,我只是给了你一小部分来演示它是如何编写的。问题是该方法根本没有被命中,就像它不存在一样。我有一个断点来确定。
猜你喜欢
  • 2016-12-24
  • 1970-01-01
  • 2021-12-21
  • 2015-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-09
  • 1970-01-01
相关资源
最近更新 更多