在我的ASP.NET MVC应用程序中,使用此AJAX调用:
$.ajax({
type: 'GET',
url: '@Url.Action("GetUnitReportPairVals", "Home")',
data: { unit: unitval, report: rptval }, // data: model,
contentType: 'application/json',
cache: false,
success: function (result) {
alert(result);
},
error: function (result) {
alert('failed');
alert(result);
}
});
...调用此Controller方法:
public JsonResult GetUnitReportPairVals(string unit, string report)
{
int rptId = GetReportIDForName(report);
DataTable UnitReportPairEmailValsDT = new DataTable();
string qry = string.Format(SQL.UnitReportPairEmailQuery, unit, rptId);
UnitReportPairEmailValsDT = SQL.ExecuteSQLReturnDataTable(
qry,
CommandType.Text,
null
);
var model = UnitReportPairEmailValsDT;
return Json(model);
}
我看到“失败”警报,“结果”对象没有数据结束;这里只是冰山一角:
似乎关键是状态为500,状态文本为“内部服务器错误”
所以我注释掉了这两行,然后在“调试器”中添加了它们(正如nurdyguy在这里所提到的[Why is my AJAXoned Action's return not being seen as successful by the caller?:
$.ajax({
. . .
error: function (result) {
debugger;
//alert('failed');
//alert(result);
}
});
......但我看不出是什么让我感到惊讶。通过它的步调放置ajax调用只是在浏览器中没有显示任何内容;使用Chrome DevTools,我可以介入它,但是一旦我进入“调试器”行,它对我没有任何好处。即使是那条线上的F11也什么也没做。
那么我怎样才能找到导致此500 /内部服务器错误的原因?
由于我已经从jquery AJAX调用中注释掉了“json”行(“var model = JSON.stringify({})”和“contentType:'application / json'”),我是否还应该更改Controller返回从JsonResult到ActionResult的类型和“返回视图(模型)”?
我现在用我的AJAX方法获得了“成功”,并结合了几个建议,并将模型从DataTable成员更改为字符串的通用列表:
// Model (C#)
public class UnitReportPairModel
{
public List<String> UnitReportPairEmailVals { get; set; }
. . .
}
// Controller (C#)
public JsonResult GetUnitReportPairEmailAddresses(string unit, string report)
{
UnitReportPairModel model = new UnitReportPairModel();
try
{
int rptId = GetReportIDForName(report);
DataTable UnitReportPairEmailValsDT = new DataTable();
string qry = string.Format(SQL.UnitReportPairEmailQuery, unit, rptId);
UnitReportPairEmailValsDT = SQL.ExecuteSQLReturnDataTable(
qry,
CommandType.Text,
null
);
List<String> emailAddresses = UnitReportPairEmailValsDT
.AsEnumerable()
.Select(row => row.Field<string>("EmailAddr"))
.ToList();
model.UnitReportPairEmailVals = emailAddresses;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
return Json(model, JsonRequestBehavior.AllowGet);
}
// View (jquery)
var model = JSON.stringify({ unit: unitval, report: rptval });
$.ajax({
type: 'GET',
url: '@Url.Action("GetUnitReportPairEmailAddresses",
"UnitReportPair")',
data: { unit: unitval, report: rptval }, // data: model,
contentType: 'application/json',
cache: false,
success: function (result) {
alert('success');
alert(result.data);
},
error: function () {
alert('failure');
}
});
在我将这个问题和相关问题的几个不同答案拼凑在一起后,我写了一篇关于如何执行此操作的提示here。
答案 0 :(得分:1)
contentType: "application/json; charset=utf-8",
dataType: "json",
同时检查chrome dev工具的网络选项卡,检查您的请求是否生成了包含数据的有效GET URL以及调查响应输出。 - 希望帮助
答案 1 :(得分:1)
您的浏览器可以帮助您调试已发送和已接收的邮件。我认为它在所有浏览器中都是F12(不包括Safari),并且应该有一个用于捕获和显示所有流量的网络选项卡。
您的IDE通过适当的调试设置可以引导您完成代码并捕获大多数服务器错误(Visual Studios有一个内置调试器,xdebug可用于PHP)。
最后,您可以下载类似Fiddler http://www.telerik.com/fiddler的内容,您可以在网络级别提供更多详细信息,类似于浏览器调试工具。这对于评估通过AJAX调用发送和接收的数据非常有用。
答案 2 :(得分:1)
由于它是一个GET操作方法,如果要返回json数据,则应明确指定JsonRequestBehaviour.AllowGet
。
这应该解决它。
return Json(model,JsonRequestBehavior.AllowGet);
如果您的操作方法使用[HttpPost]
进行修饰并且您正在进行POST调用,则无需明确指定它,return Json(model)
将正常工作。
Here对此有更详细的解释。