-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);
});

There の値はi、ループを終了させた値である可能性が最も高いです ( 21)。

値で渡された値を取得して、クロージャーを破る必要があります...

$.get('@Url.Action("GetMessageTypeByMessageTypeID")', { MessageTypeID: sMessageTypeID }, (function (j) {
    return function(data) { $('#MessageTypes' + j).val(data); };
})(i));
于 2012-09-10T22:22:51.927 に答える