现在坚持这个问题几个小时......认为这与在循环中使用$ .get及其异步性有关,但我无法弄明白。
如果在$ .get行上通过firebug添加断点,则此代码有效,但如果我只运行它则不起作用。
基本上我想在页面加载时遍历20个隐藏字段,并根据值设置下拉列表值
for (i = 1; i <= 21; i++) {
var sMessageTypeID = $('#MessageOrder' + i).val();
//This line calls the Controller and populates the corresponding MessageType Drop down
$.get('@Url.Action("GetMessageTypeByMessageTypeID")', { MessageTypeID: sMessageTypeID }, function (data) {
$('#MessageTypes' + i).val(data);
});
};
这是控制器代码
public JsonResult GetMessageTypeByMessageTypeID(long MessageTypeID)
{
tblMessageType tblMessageType = db.tblMessageTypes.Single(t => t.MessageTypeID == MessageTypeID);
return Json(tblMessageType.MessageType, JsonRequestBehavior.AllowGet);
}
答案 0 :(得分:2)
除了@alex提供的关于闭包的解决方案之外,我想指出一个非常糟糕的主意,就像你现在所做的那样,用循环中的AJAX请求来锤击你的服务器。想象一下,多个用户访问此页面。我建议你在一个AJAX请求中发送id并调整控制器动作以返回一个数组:
var messageIds = [];
for (i = 1; i <= 21; i++) {
messageIds.push($('#MessageOrder' + i).val());
}
// send a single AJAX request to the controller action:
$.get('@Url.Action("GetMessageTypeByMessageTypeID")', { messageIds: messageIds }, function (data) {
for (var i = 0; i < data.length; i++) {
$('#MessageTypes' + (i + 1)).val(data[i]);
}
});
最后更新控制器操作,以便它处理多个ID:
public ActionResult GetMessageTypeByMessageTypeID(long[] messageIds)
{
var messageTypes =
from t in db.tblMessageTypes
where messageIds.Contains(t.MessageTypeID)
select t.MessageType;
return Json(messageTypes.ToList(), JsonRequestBehavior.AllowGet);
}
答案 1 :(得分:0)
以下这一行有一个匿名函数,可以关闭其祖先范围。
$.get('@Url.Action("GetMessageTypeByMessageTypeID")', { MessageTypeID: sMessageTypeID }, function (data) {
$('#MessageTypes' + i).val(data);
});
i
的值很可能是终止循环的值(21
)。
你需要通过获取值传递的值来打破闭包......
$.get('@Url.Action("GetMessageTypeByMessageTypeID")', { MessageTypeID: sMessageTypeID }, (function (j) {
return function(data) { $('#MessageTypes' + j).val(data); };
})(i));