AJAX调用MVC5 ActionResult

时间:2016-01-08 18:09:48

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

我想弄清楚以下代码有什么问题:

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

当我在栏中输入网址时,它没有问题,但是当我尝试进行ajax调用时,我发现404 Page not found错误。

为了澄清,当我点击按钮时,我得到一个弹出窗口,上面写着“没有记录得分”,而且在开发人员工具上,我收到一个脚本错误,说找不到页面。

我还在visusal studio中有一个关于方法本身的断点,但是从来没有打过这个点,因为方法永远不会被调用。

服务器端代码:

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;
    }
});

2 个答案:

答案 0 :(得分:1)

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

此外,根据您的评论,似乎事件是IIS中虚拟目录/应用程序名称的名称您不应该在代码中使用这些来构建网址,因为它可能会根据您的部署进​​行更改。如果您希望将代码副本部署到"http://staging.yourSite.com"

,该怎么办?

只要您使用Url.Action辅助方法,它就会为您的应用构建正确的相对网址,而您无需担心您的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。

<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);

或使用基本网址构建。

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

答案 1 :(得分:0)

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

public async Task<ActionResult> ReportScore() { var a = "abc" } 您的代码块不显示任何return语句,请确保等待您的返回值。 即 return await "abc"