Обработка JavaScript и ASP.NET MVC - PullRequest
1 голос
/ 30 января 2012

У меня есть следующий javascript и JsonResult. Проблема, с которой я сталкиваюсь, заключается в том, что сообщение Ajax не дает достаточно времени для JsonResult, чтобы вернуть соответствующие данные. Я, вероятно, не совсем понимаю обработку javascript, и я уверен, что это сделано специально, но мне интересно, как я могу сделать это синхронный запрос. Короче говоря, дождитесь завершения действия JsonResult, прежде чем JavaScript продолжит обработку.

<script type="text/javascript">
$(document).ready(function () {

    var table = document.getElementById("updateTable");
    var tasks = new Array("shutdown", "prep", "boot", "ready");
    var tasksLength = tasks.length;

    for (var i in tasks) {

        for (var loop = 1, max = table.rows.length; loop < max; loop++) {

            id = table.rows[loop].cells[0].innerHTML;
            task = tasks[i];

            ImageUpdateStatus = {
                ImageId: parseInt(id),
                Task: task,
                Status: "pending"
            }

            $.ajax({
                type: "POST",
                url: "UpdateStatus",
                data: $.postify(ImageUpdateStatus),
                success: function (data) {
                    var status = data.status;
                }
            });

            ImageUpdateStatus.Status = status;

            if (ImageUpdateStatus.Status == "success") {

                task = task.concat(" ");

                document.getElementById(task.concat(id)).src = "/PVSUtil_ver2/Assets/Images/Image.Success.png";

                j = parseInt(i) + 1;
                if (j < tasksLength) {
                    nextTask = tasks[j];
                    nextTask = nextTask.concat(" ");
                    document.getElementById(nextTask.concat(id)).src = "/PVSUtil_ver2/Assets/Images/Image.Load.gif";
                }
            }
        }
    }

    document.getElementById('nextButton').className = "navigation";
    document.getElementById('nextButton').disabled = false;
});

    //
    // GET: /Build/UpdateStatus
    public JsonResult UpdateStatus(ImageUpdateStatus imageUpdateStatus, SessionStateItemCollection sessionItems = null)
    {
        var data = new object();
        string status = null;

        ImageInfo imageInfo = new ImageInfo();
        IImageInfoServices svcImageInfo = new ImageInfoServicesRepository();
        imageInfo = svcImageInfo.GetImageByImageId(imageUpdateStatus.ImageId);

        IDeviceControlServices svcDevice = new DeviceControlServicesRespository();
        IPVSCommandServices svcPVSCmds = new PVSCommandServicesRespository();

        if (imageUpdateStatus.Task == "shutdown")
        {
            status = svcDevice.Shutdown(imageInfo.ImageId);
            //status = "success";

            data = new
            {
                status
            };
        }

        if (imageUpdateStatus.Task == "prep")
        {
            List<UpdateReasonForm> updateReasonForms;

            if (sessionItems.Keys.Count > 0)
            {
                updateReasonForms = sessionItems["UpdateReasonForms"] as List<UpdateReasonForm>;
            }
            else
            {
                updateReasonForms = Session["UpdateReasonForms"] as List<UpdateReasonForm>;
            }

            foreach (var item in updateReasonForms)
            {
                if (item.ImageId == imageInfo.ImageId)
                {
                    status = svcPVSCmds.PrepImage(imageInfo, item.NewVersion);
                }
            }

            data = new
            {
                status
            };
        }

        if (imageUpdateStatus.Task == "boot")
        {
            status = svcDevice.Boot(imageInfo.ImageId);

            data = new
            {
                status
            };
        }

        if (imageUpdateStatus.Task == "ready")
        {
            status = "success";

            data = new
            {
                status
            };
        }

        return this.Json(data, JsonRequestBehavior.AllowGet);
    }

Ответы [ 4 ]

3 голосов
/ 30 января 2012

Просто переместите код, основанный на результате запроса ajax, в функцию обратного вызова success:

$.ajax({
    type: "POST",
    url: "UpdateStatus",
    data: $.postify(ImageUpdateStatus),
    success: function (data) {      
        ImageUpdateStatus.Status = data.status;

        if (ImageUpdateStatus.Status == "success") {

            task = task.concat(" ");

            document.getElementById(task.concat(id)).src = "/PVSUtil_ver2/Assets/Images/Image.Success.png";

            j = parseInt(i) + 1;
            if (j < tasksLength) {
                nextTask = tasks[j];
                nextTask = nextTask.concat(" ");
                document.getElementById(nextTask.concat(id)).src = "/PVSUtil_ver2/Assets/Images/Image.Load.gif";
            }
        }
    }
});
2 голосов
/ 30 января 2012

Вы не хотите делать запрос синхронным; Вы хотите поместить весь код, который зависит от результата, в ваш обратный вызов:

 $.ajax({
        type: "POST",
        url: "UpdateStatus",
        data: $.postify(ImageUpdateStatus),
        success: function (data) {
            var status = data.status;

            ImageUpdateStatus.Status = status;

            if (ImageUpdateStatus.Status == "success") {
                task = task.concat(" ");
                document.getElementById(task.concat(id)).src = "/PVSUtil_ver2/Assets/Images/Image.Success.png";

                j = parseInt(i) + 1;
                if (j < tasksLength) {
                   nextTask = tasks[j];
                   nextTask = nextTask.concat(" ");
                   document.getElementById(nextTask.concat(id)).src = "/PVSUtil_ver2/Assets/Images/Image.Load.gif";
                }
            }
        }
    });
0 голосов
/ 30 января 2012

Я действительно чувствую, что вам следует объединить любые данные, которые вам нужны, чтобы впервые представить ваше представление на стороне сервера, а затем перенести их на страницу. Вы можете использовать JavaScript для рендеринга, когда данные находятся на странице (могут храниться в формате JSON в скрытом поле), но я не думаю, что оптимально, чтобы страница выполняла вызов Ajax при первом рендеринге .

0 голосов
/ 30 января 2012
$.ajax({
                type: "POST",
                async: false,
                url: "UpdateStatus",
                data: $.postify(ImageUpdateStatus),
                success: function (data) {
                    var status = data.status;
                }
            });

но вы действительно должны этого избегать, вы должны действительно заставить ваше приложение работать с этим ожиданием ajax-запроса

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...