我想知道为什么AJAX
调用的函数在这种情况下会失败?当FillObj()
选择发生变化时,应该调用dropdownlist
。
<div class="form-group">
@Html.LabelFor(model => model.Module, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.DropDownListFor(model => model.Module, new SelectList(Model.ModuleList, "Value", "Text"),
"- Please select a Module -", new { @onchange = "FillObj()", @class = "form-control" })
</div>
</div>
正如您所见,我已在@onchange
代码中将FillObj()
设置为Dropdownlist
。但是,当选择发生变化时,它会保持alert('A error')
而不是成功。以下是AJAX function
:
function FillObj() {
var moduleID = $('#Module').val();
$.ajax({
url: '/Questions/FillObjectives',
type: "GET",
dataType: "JSON",
data: { module: moduleID },
success: function (objectives) {
$("#objective").html(""); // clear before appending new list
$.each(objectives, function (i, Obj) {
$("#objective").append(
$('<option></option>').val(Obj.ObjectiveId).html(Obj.objective));
});
},
error: function () {
alert('A error');
}
});
}
控制器:
public ActionResult FillObjectives(int module)
{
var objectives = db.Objectives.Where(o => o.ModuleId == module);
return Json(objectives, JsonRequestBehavior.AllowGet);
}
编辑1:
好的,我做了一些调试,发现只要调用该函数就会出现此错误消息:
无论如何要解决这个问题?
答案 0 :(得分:1)
请参阅编辑1中的编辑
如果您使用GET
呼叫您的操作,则无法在正文中发送数据。你不能这样做:
data: { module: moduleID },
您可以将其作为查询字符串附加到网址的末尾。
url: '/Questions/FillObjectives?module=' + moduleID,
或者您可以将通话更改为POST
,但请确保您的操作未应用HttpGet
属性。
编辑1
感谢Stephen Muecke的评论,上面我说不应该进行GET
操作data { module: moduleID }
。这是正确的一半。由于这个答案被推翻了几次,我分享这个,所以其他人,在同样的印象下,会知道这是不正确的。如果发布的内容已经是string
,则无效。如果它不是字符串,jQuery会将其转换为字符串并将其附加到URL。这是来自jQuery docs:
要发送到服务器的数据。如果不是字符串,它将转换为查询字符串。它已附加到GET请求的URL。
在发布的问题中,它不是一个字符串,因此jQuery会将数据转换为字符串并将其附加到url。
因此,总的来说,这个问题中发布的代码会起作用,但它出错的原因是控制器中的代码错误输出。如果你在控制器中执行此操作,它将在客户端成功:
public ActionResult FillObjectives(int module)
{
var data = new[]{ new { ObjectiveId = 1, objective = "Option 1" }, new { ObjectiveId = 2, objective = "Option 2" } };
return Json(data, JsonRequestBehavior.AllowGet);
}
所以最有可能的问题是这行代码:
var objectives = db.Objectives.Where(o => o.ModuleId == module);