$.ajax方法未调用控制器操作方法

4

我将在@Html.ActionLink的点击事件上调用javascript函数。这个Javascript函数调用了一个jquery函数,其中我编写了$.ajax方法来调用JSON控制器方法。但它却没有调用控制器方法......

这是我的代码:

视图

@Html.ActionLink("Submit", "AdminEvaluate", "Application", new { onclick = "Show('" + Model.applicationList.ApplicationId + "','statusList')" })|

这里,ApplicationId来自数据库,statusList是单选按钮组的名称,我需要找到选中的单选按钮。 Javascipt和jQuery代码:
function Show(appId, appStatus) {
    $.fn.gotof(appId,appStatus);
}

从视图中获取参数并传递给jQuery函数
jQuery函数
$(document).ready(function () {
    $.fn.gotof = function (appId, appStatus) {
        var selectedItem = $("input[name='" + appStatus + "']:checked").val();  
        $.ajax({
            url: '/Application/UpdateApplicantStatus',
            data: { id: appId , status: selectedItem},
            traditional: true,
            dataType: "json",
            contentType: "application/json",
            success: function (data) {
                alert(data);
            }
        });
    });

控制器方法

public JsonResult UpdateApplicantStatus(int id, string status){
    return Json("Correct", JsonRequestBehavior.AllowGet);
}   

我已经在控制器方法上设置了断点,但它没有停在断点处。
提前感谢。

1
我认为应该将ApplicationController改为Application。 - Umesh Sehta
1
你应该使用@Url.Action(...)。 - long.luc
为什么要只使用应用程序...我在许多控制器中都使用过,但以前没有遇到任何问题... - Ravindra
哦,抱歉我明白了,只需要使用应用程序...我已经做出了更改,但仍然没有解决我的问题... - Ravindra
你的浏览器控制台有任何错误吗?为了避免路由错误,请使用 Razor 语法,例如:url: '@Url.Action("UpdateApplicantStatus", "Application")' - AlexB
显示剩余6条评论
5个回答

4

也许这个样例可以帮到您 :) 请告诉我

使用type进行ajax调用:

 $.ajax({
            type: "GET",
            url: '@Url.Action("UpdateApplicantStatus", "Application")',
            contentType: "application/json; charset=utf-8",
            data: { id: appId , status: selectedItem },
            dataType: "json",
            success: function() { alert('Success'); }

            });

控制器:

public ActionResult UpdateApplicantStatus(int id, string status){
    return Json(// blah blah blah ...
}  

这应该可以运行,如果有问题请告诉我。

哇,非常感谢...现在控制权已经传递到控制器方法中了,非常感谢。 - Ravindra
很高兴能帮上忙 :) 好的,我猜在 AJAX 调用中你没有提到 GET,URL 是完美的,没有问题。你尝试使用 ActionResult 或 JsonResult 吗?让我知道。如果你使用了 JsonResult 并且它起作用了,那么 type="GET" 就是罪魁祸首(AJAX 调用查找要调用哪种类型,默认情况下控制器中的 httpget)。这些小错误很难发现。小事情会浪费我们更多的时间 :) - super cool
但我已经使用了get和post,但结果是一样的。我唯一没有使用的是contentType: "application/json; charset=utf-8",charset我没有使用...如果我们使用它或不使用它会有什么区别... - Ravindra
我在 Action Result 和 JSON Result 中都使用了它,但它仍然不能进入控制器方法。 - Ravindra
字符集UTF-8用于浏览器依赖性,即编码等方面的内容。你尝试过除IE以外的其他浏览器吗? - super cool

1
你的 ajax 调用有误。
如果你的控制器方法签名为:
public JsonResult UpdateApplicantStatus(int id, string appStatus)

您需要确保参数名称与ajax调用中的参数名称匹配。
因此,而不是使用:
data: { id: appId , status: selectedItem}

只需写

data: { id: appId , appStatus: selectedItem}

如果您有其他问题,请在浏览器控制台中发布错误信息。

我已按照您的建议更改了名称,但控件仍未进入控制器方法,并且我的浏览器控制台中没有错误。 - Ravindra

0

坐在这里几个小时了:

When using ajax - json in a js.script file:

the url is written with its real path e.g. -  url: '/contoller/Action',


                                $.ajax({
                                   url: '/NextPage/GetSpDropDown',                                      
                                   data: {'segInputVal': segInputVal}, 
                                    cache: false, 
                                    type: "GET",
                                    dataType: "json",
                                    success: function (result) {
                                     if (result.Success) {
                                     var resultArray = result.Result;.....

如果脚本写在你的HTML页面中,则必须使用

@(Url.Action(Action,controller))

                                   $.ajax({
                       url: "@(Url.Action("GetSpDropDown", "NextPage"))",
                                    data: { 'segInputVal': segInputVal },
                                    cache: false,
                                    type: "GET",
                                    dataType: "json",
                                    success: function (result) {
                                     if (result.Success) {
                                     var resultArray = result.Result;....

不要忘记在控制器名称中不包含单词“controller”。

我从stackoverflow得到了很多帮助- 希望能回馈一点。


0

或许控制器函数和Ajax调用函数的参数名称应该匹配。

你可以试试这个:

data: { id: appId , appStatus: selectedItem},


我已经按照你的建议更改了名称,但问题仍然存在。 - Ravindra
@Ravindra 你的应用程序中使用了区域吗? - sivakumarrd
不,我没有使用任何区域。 - Ravindra

0

这样做实际上有3个错误。第一个错误是由@Mr Code指出的,类型缺失。第二个错误是你的参数不匹配,因为你的函数只接受一个参数,而你发送的数据格式错误。

$(document).ready(function () {
    $.fn.gotof = function (appId, appStatus) {
        var selectedItem = $("input[name='" + appStatus + "']:checked").val();  
        $.ajax({
            url: '/ApplicationController/UpdateApplicantStatus',
data:"{'id':'" + appId + "', 'appStatus': '" + selectedItem+ "'}",//here you format is wrong i correct it
            traditional: true,
            dataType: "json",
            contentType: "application/json",
            success: function (data) {
                alert(data);
            }
        });
    });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接