Jquery 为什么我的AJAXoned动作';调用方认为s返回不成功?

Jquery 为什么我的AJAXoned动作';调用方认为s返回不成功?,jquery,ajax,asp.net-mvc,actionresult,url-action,Jquery,Ajax,Asp.net Mvc,Actionresult,Url Action,在我的ASP.NET MVC应用程序中,我在视图的脚本部分调用了AJAX: $(".ckbx").change(function () { . . . $.ajax({ type: 'GET', url: '@Url.Action("GetUnitReportPairVals", "Home")', data: { unit: unitval, report: rptval }, cache: false,

在我的ASP.NET MVC应用程序中,我在视图的脚本部分调用了AJAX:

$(".ckbx").change(function () {
. . .
    $.ajax({
        type: 'GET',
        url: '@Url.Action("GetUnitReportPairVals", "Home")',
        data: { unit: unitval, report: rptval },
        cache: false,
        success: function (result) {
            alert(result);
        }
    });
});
逐步执行正在调用的控制器操作:

public ActionResult GetUnitReportPairVals(string unit, string report)
{
    HomeModel model = new HomeModel();

    int rptId = GetReportIDForName(report);

    DataTable UnitReportPairEmailValsDT = new DataTable();
    UnitReportPairEmailValsDT = SQL.ExecuteSQLReturnDataTable(
        SQL.UnitReportPairEmailQuery, 
        CommandType.Text, 
        new SqlParameter()
                {
                    ParameterName = "@Unit",
                    SqlDbType = SqlDbType.VarChar,
                    Value = unit
                },
                new SqlParameter()
                {
                    ParameterName = "@RptID",
                    SqlDbType = SqlDbType.Int,
                    Value = rptId
                }
                );

    model.UnitReportPairEmailVals = UnitReportPairEmailValsDT;
    return View(model);
}
……一切似乎都很顺利;“模型”包含UnitReportPairEmailVals中的预期值

但我从未在Ajax调用中看到这里的警告消息:

success: function (result) {
    alert(result);
} 
那么,为什么jqueryajax调用的“success”函数没有实现呢

更新 顺便说一句,这可能是一个线索:我的控制器方法的最后一行:

return View(model);
…将“视图”一词涂成红色,就像罗德岛公鸡的梳子一样。但如果不是这样,那应该是什么呢?这与我在“public ActionResult Index()”控制器操作末尾的内容完全相同,效果很好

更新2 我将Ajax调用的结尾更改为:

success: function (result) {
    alert(result);
},
failure: function (error) {
    alert(error);
}
…以及我的控制器方法的结尾:

return Json(new { Result = model }, JsonRequestBehavior.AllowGet);
…但我没有警觉,无论是成功还是失败

更新3 注意:当我尝试此操作时:

var model = JSON.stringify({ unit: unitval, report: rptval });
    $.ajax({
        type: 'GET',
        url: '@Url.Action("GetUnitReportPairVals", "Home")',
        data: model,
        contentType: 'application/json',
        cache: false,
        success: function (result) {
            alert(result);
        },
        error: function (result) {
            debugger;
        }
    });
…“单位”是空的,所以它根本不会飞

当我将其更改为此时(删除第1行并将“data”arg更改回以前使用的内容):

…“单位”是我所期望的(也是“报告”),但我最终看到的是“失败”

更新4 当我拼凑出几个不同的答案来回答这个问题和相关的问题后,我写了一篇关于如何做到这一点的小贴士

更新5 我有一个[工作]ajax调用[工作]:

var model = JSON.stringify({ unit: unitval, report: 1 });
$.ajax({
    type: 'GET',
    url: '@Url.Action("GetUnitDataRangeParamsVals", "UnitReportDataRangeParams")',
    data: { unit: unitval, report: 1 },
    contentType: 'application/json',
    cache: false,
    success: function (returneddata) {
        populatedatarangeprams(1, returneddata);
    },
    error: function () {
        alert('error - returneddata.error.stringify');
    }
});
…但我没有使用声明的“模型”,根据我的理解,它与“contentType:‘application/json’”成对使用

所以我想我应该做的是这样的:

var model = JSON.stringify({ unit: unitval, report: 1 });
$.ajax({
    type: 'GET',
    url: '@Url.Action("GetUnitDataRangeParamsVals", "UnitReportDataRangeParams")',
    data: model,
    contentType: 'application/json',
    cache: false,
    success: function (returneddata) {
        populatedatarangeprams(1, returneddata);
    },
    error: function () {
        alert('error - returneddata.error.stringify');
    }
});
现在,传递给控制器方法的数据是json字符串格式(封装在“模型”中)

但是,它甚至不起作用

它适用于第一个块,但不适用于第二个块


因此,我删除了“model”和“contentType”行,并将“data”行改回原来的状态,并且工作正常。那么它们是无用的,还是我错误地使用了它们?

这里是我在ASP.NET MVC中执行ajax时使用的一些片段

$(".ckbx").change(function () {
    .....
    var model = JSON.stringify({ unit: unitval, report: rptval });
    $.ajax({
        type: 'GET',
        url: '@Url.Action("GetUnitReportPairVals", "Home")',
        data: model,
        contentType: 'application/json',
        cache: false,
        success: function (result) {
            alert(result);
        },
        error: function(result) {
            debugger;
        }
    });
});
有时,这两个更改(与原始更改相比)是不必要的,但如果json不正确,ASP.NET可能会有点挑剔,这会有所帮助。因为您可以逐步使用控制器方法,所以这不是您的问题,但它很方便

您真正的问题是控制器方法上的返回类型。ActionResult意味着它将查找相应的视图,并基于该视图构建html。但是如果您正在使用ajax,那么您可能不希望这样做

public JsonResult GetUnitReportPairVals(string unit, string report)
{
    // do some stuff
    // then create response model
    var model = ...//whatever data you are returning here
    return Json(model);
}
这是ASP.NET MVC中ajax调用的“标准”方法

$(".ckbx").change(function () {
    .....
    var model = JSON.stringify({ unit: unitval, report: rptval });
    $.ajax({
        type: 'GET',
        url: '@Url.Action("GetUnitReportPairVals", "Home")',
        data: model,
        contentType: 'application/json',
        cache: false,
        success: function (result) {
            alert(result);
        },
        error: function(result) {
            debugger;
        }
    });
});

正如您在评论中指出的,ActionResult在索引方法中非常有效。是的,因为index方法的目的是加载页面。通常,如果该方法用于加载页面,那么您将使用ActionResult,因为它将使用视图为该页面创建html。但如果您只是提交信息,然后返回一个类似“success”的响应,那么您不需要完整的html响应,而是需要json。这就是JsonResult在这里工作的原因。

以下是我在ASP.NET MVC中执行ajax时使用的几个片段

$(".ckbx").change(function () {
    .....
    var model = JSON.stringify({ unit: unitval, report: rptval });
    $.ajax({
        type: 'GET',
        url: '@Url.Action("GetUnitReportPairVals", "Home")',
        data: model,
        contentType: 'application/json',
        cache: false,
        success: function (result) {
            alert(result);
        },
        error: function(result) {
            debugger;
        }
    });
});
有时,这两个更改(与原始更改相比)是不必要的,但如果json不正确,ASP.NET可能会有点挑剔,这会有所帮助。因为您可以逐步使用控制器方法,所以这不是您的问题,但它很方便

您真正的问题是控制器方法上的返回类型。ActionResult意味着它将查找相应的视图,并基于该视图构建html。但是如果您正在使用ajax,那么您可能不希望这样做

public JsonResult GetUnitReportPairVals(string unit, string report)
{
    // do some stuff
    // then create response model
    var model = ...//whatever data you are returning here
    return Json(model);
}
这是ASP.NET MVC中ajax调用的“标准”方法

$(".ckbx").change(function () {
    .....
    var model = JSON.stringify({ unit: unitval, report: rptval });
    $.ajax({
        type: 'GET',
        url: '@Url.Action("GetUnitReportPairVals", "Home")',
        data: model,
        contentType: 'application/json',
        cache: false,
        success: function (result) {
            alert(result);
        },
        error: function(result) {
            debugger;
        }
    });
});

正如您在评论中指出的,ActionResult在索引方法中非常有效。是的,因为index方法的目的是加载页面。通常,如果该方法用于加载页面,那么您将使用ActionResult,因为它将使用视图为该页面创建html。但如果您只是提交信息,然后返回一个类似“success”的响应,那么您不需要完整的html响应,而是需要json。这就是JsonResult在这里工作的原因。

我怀疑您没有为此操作创建视图,这将导致ajax调用在异常情况下失败,因为razor引擎将无法找到该视图。确保此操作的视图存在,或者如果要返回其他视图,请指定如下内容:

 return View(model,"ViewName");
您还可以添加故障回拨以查看出现了什么问题:

success: function (result) {
            alert(result);
        },
error: function(error){
           console.log(error);
        }
更新: 如果您只想返回数据,请使用Json:

return Json(new {Result = model },JsonRequestBehavior.AllowGet);

我怀疑您没有为此操作创建视图,这将导致ajax调用在异常情况下失败,因为razor引擎将无法找到该视图。确保此操作的视图存在,或者如果要返回其他视图,请指定如下内容:

 return View(model,"ViewName");
您还可以添加故障回拨以查看出现了什么问题:

success: function (result) {
            alert(result);
        },
error: function(error){
           console.log(error);
        }
更新: 如果您只想返回数据,请使用Json:

return Json(new {Result = model },JsonRequestBehavior.AllowGet);

您是否能够向控制器方法添加断点,并在提交时点击该断点?作为旁注,我通常在ajax中使用以下内容:contentType:'application/json',data:json.stringify(model)是的,我可以很好地逐步完成它;你把上面提到的jazz放在哪里?哦,是的,你需要改变控制器方法的响应类型。ActionResult意味着控制器将尝试找到一个视图并完成整个操作。但是如果您只是使用ajax,那么您希望使用JsonResult作为返回类型。然后一个json字符串将返回给ajax。我马上就把它写下来回答什么?我在索引方法中使用了相同的响应类型(ActionResult),它工作得很好…您是否为该操作创建了视图?您是否能够向cont添加断点