为什么我的AJAXoned Action的回复没有被调用者视为成功?
在我的ASP.NET MVC应用程序中,我在View的脚本部分中有这个AJAX调用:
$(".ckbx").change(function () { . . . $.ajax({ type: 'GET', url: '@Url.Action("GetUnitReportPairVals", "Home")', data: { unit: unitval, report: rptval }, cache: false, success: function (result) { alert(result); } }); });
逐步调用Controller动作:
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); }
……一切似乎都很好; “model”包含UnitReportPairEmailVals中的预期值。
但我从来没有在Ajax调用中看到来自此处的警报消息:
success: function (result) { alert(result); }
那么为什么没有达到jQuery AJAX调用的“成功”function呢?
UPDATE
顺便说一下,这可能是一个线索:我的Controller方法的最后一行:
return View(model);
……将“查看”这个词描绘成罗德岛公鸡的梳子。 但如果它不应该那样,它应该是什么? 这与我的“公共ActionResult Index()”控制器Action的结尾完全相同,它运行正常。
更新2
我将Ajax调用的结束更改为:
success: function (result) { alert(result); }, failure: function (error) { alert(error); }
…以及我的Controller方法结束:
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行并将“数据”arg更改回我之前使用的内容):
$.ajax({ type: 'GET', url: '@Url.Action("GetUnitReportPairVals", "Home")', data: { unit: unitval, report: rptval }, contentType: 'application/json', cache: false, success: function (result) { alert(result); }, error: function (result) { alert('failed'); } });
……“单位”是我所期望的(并且“报告”),但我最终看到’失败’。
更新4
一旦我拼凑了几个不同的答案和相关的问题,我在这里写了一个关于如何做到这一点的小贴士。
更新5
我有[工作] ajax调用[working]:
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”中)。
但是,它甚至不起作用。
它适用于第一个块,但不适用于第二个块。
所以我删除了“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调用的“标准”方法。
正如您在评论中指出的那样,ActionResult在Index方法中运行良好。 是的,因为索引方法的目的是加载页面。 通常,如果该方法用于加载页面,那么您将使用ActionResult,因为它将使用视图为该页面创建html。 但是,如果您只是提交信息然后返回“成功”之类的响应,那么您不需要整个HTML响应,您需要json。 这就是JsonResult在这里工作的原因。
我怀疑你没有为这个动作创建视图,这会导致ajax调用在exception情况下失败,因为razor引擎将无法找到View。 确保此操作存在View,或者如果要返回其他视图,请指定:
return View(model,"ViewName");
你还可以添加失败回调以查看出现了什么问题:
success: function (result) { alert(result); }, error: function(error){ console.log(error); }
更新:
如果您只想返回数据,那么使用Json:
return Json(new {Result = model },JsonRequestBehavior.AllowGet);