1

MVC3、C#、jQuery、Ajax ++ の使用

私のhtml

<div>
   <a href="#" id="startProcess">Start Long Running Process</a>
</div>
<br />
<div id="statusBorder">
    <div id="statusFill">
    </div>
</div>

htmlのjavascript部分部分

    var uniqueId = '<%= Guid.NewGuid().ToString() %>';

    $(document).ready(function (event) {
        $('#startProcess').click(function () {
            $.post("SendToDB/StartLongRunningProcess", { id: uniqueId,
                                 //other parameters to be inserted like textbox

                                                             }, function () {
                $('#statusBorder').show();
                getStatus();
            });
            event.preventDefault;
        });
    });

     function getStatus() {
        var url = 'SendToDB/GetCurrentProgress';
        $.get(url, function (data) {
            if (data != "100") {
                $('#status').html(data);
                $('#statusFill').width(data);
                window.setTimeout("getStatus()", 100);
            }
            else {
                $('#status').html("Done");
                $('#statusBorder').hide();
                alert("The Long process has finished");
            };
        });
    }

これがコントローラーです。

    //Some global variables. I know it is not "good practice" but it works.
    private static int _GlobalSentProgress = 0;
    private static int _GlobalUsersSelected = 0;

    public void StartLongRunningProcess(string id,
                                        //other parameters
                                        )
    {   
        int percentDone = 0;
        int sent = 0;            

        IEnumerable<BatchListModel> users;

        users = new UserService(_userRepository.Session).GetUsers(
                //several parameters)

        foreach (var c in users)
        {
                var usr = _userRepository.LoadByID(c.ID);

                var message = new DbLog
                {
                    //insert parameters
                };

                _DbLogRepository.Save(message);
                sent++;

                double _GlobalSentProgress = (double)sent / (double)_GlobalUsersSelected * 100;

                if (percentDone < 100)
                {
                    percentDone = Convert.ToInt32(_GlobalSentProgress);
        }

//this is supposed to give the current progress to the "GetStatus" in the javascript
public int GetCurrentProgress()
    {
        return _GlobalSentProgress;
    }

現在、進行状況バーのある div は表示されません。それは正直なところ壊れています。しかし、私の論理を理解していただければ幸いです。

挿入を行うループでは、次の計算があります。

double _GlobalSentProgress = (double)sent / (double)_GlobalUsersSelected * 100;

次に、_GlobalSentProgress を通常の int に変換します。

percentDone = Convert.ToInt32(_GlobalSentProgress);

そのため、小数はもうありません。

この "percentDone" または "_GlobalSentProgress" 変数 (挿入された割合を完全に示しています) を、ループするたびに javascript の "data" 変数に非同期で送信できれば、機能します。次に、「data」は常に「statusFill」を実行し、バーを正しく表示します。これは私が使用するロジックです。

これを達成するために投げかけられた言葉は「非同期」だと思います。私は2つの非常に有望なガイドを見てきましたが、ループで動作させることができませんでした.

どうすればこれを行うことができるかについて誰にも提案がありますか?

4

1 に答える 1

1

編集 2: 外側の div の名前は statusBorder ではなく status です。

于 2013-02-25T21:51:08.587 に答える