for循环和$ .get函数的问题

时间:2012-09-10 22:12:41

标签: jquery asp.net-mvc

现在坚持这个问题几个小时......认为这与在循环中使用$ .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);
    } 

2 个答案:

答案 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));