-1

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

2 回答 2

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);
} 
于 2012-09-11T04:37:38.603 回答
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));
于 2012-09-10T22:22:51.927 回答