1

私はMVC4アプリケーションを持っています

  • ブートストラップ プログレス バー (部分的なビューです) と剣道 UI を使用してファイルをアップロードするビュー:

    @using MyApplication.Web.Resources.Views.Contact;
    <div class="row">
        <div class="span6">
    
             <form class="form-horizontal well" method="post" action="@Url.Action("ImportContact","ContactAsync")">
                  @Html.ValidationSummary(true)
    
                  <script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
                  <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
    
    
                  <fieldset>
                      <legend>Contact</legend>
    
                      <p>
                          Some text...
                      </p>
    
                      @(Html.Kendo().Upload()
                      .Name("files"))
    
    
                       <div class="progress progress-striped">
                             <div class="bar" style="width: 0%;"></div>
                       </div>
    
                       <div class="form-actions"> 
                           <button type="submit" class="btn btn-primary" onclick="importMessage()">@Contact.ValidationButton</button>
                           <button type="submit" class="btn btn-secondary" onclick="window.location.href='@Url.Action("Index")';return false;">@Contact.CancelButton</button>
                       </div> 
               </fieldset>
            </form>
        </div>
    </div>   
    
  • そして、このような非同期コントローラー:

    public class ContactAsyncController : AsyncController
    {
        private BackgroundWorker worker = new BackgroundWorker();
    
        public ContactAsyncController(IContactService cs)
        {
            _contactService = cs;
        }
    
        //
        // POST: /Contact/ImportContactAsync
        [HttpPost]
        public void ImportContactAsync(IEnumerable<HttpPostedFileBase> files)
        {
            AsyncManager.OutstandingOperations.Increment();
    
            worker.WorkerReportsProgress = true;
            worker.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
            worker.DoWork += (o, e) => ImportContact(files, e);
            worker.RunWorkerCompleted += (o, e) =>
                {
                    AsyncManager.OutstandingOperations.Decrement();
                };
    
            worker.RunWorkerAsync();
        }
    
        private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            Debug.WriteLine(e.ProgressPercentage.ToString() + "%");
        }
    
        private void ImportContact(IEnumerable<HttpPostedFileBase> files, DoWorkEventArgs e)
        {
            try
            {
                if (files != null)
                {
                    string path = "";
                    string extension = "";
    
                    foreach (HttpPostedFileBase file in files)
                    {
                        if (file != null)
                        {
                            // New changes - first save the file on the server
                            file.SaveAs(Path.Combine(Server.MapPath("~/Temp/Import"), file.FileName));
    
                            // Now create a path to the file 
                            path = Path.Combine(Server.MapPath("~/Temp/Import"), file.FileName);
    
                            extension = Path.GetExtension(file.FileName);
                        }
                        else
                        {
                            // ...
                        }
                    }
    
                    if (extension == ".pst") // PST
                    {
                        ImportContactPst(path);
                    }
                    else
                    {
                        // ...
                    }
                }
            }
            catch
            {
                ViewBag.Error = myApplication.Web.Resources.Views.Contact.Contact.ErrorMessage;
            }
        }
    
        private void ImportContactPst(string path)
        {
             // Some code ...
    
             Session["test"] = // My percentage
        }
    
        public ActionResult ImportContactCompleted()
        {
            return RedirectToAction("Index","Contact");
        }
    }
    

そして、進行状況バーを進行させたいと思います。したがって、このために、次のようにビューでスクリプトを実行することを考えました。

<script>
    $(document).ready(function () {
        var progresspump = setInterval(function () {
            /* query the completion percentage from the server */
            $.ajax({
                type: "GET",
                url: "@Url.Action("GetProgressBar")",
                dataType: "json",
                cache: false,
                success: function (data) {
                    var percentComplete = parseInt(data.PercentComplete);
                    if (percentComplete == null || percentComplete == 100) {
                        $(".progress").removeClass("active"); // we're done!
                        $(".progress .bar").css("width", "100%");
                    } else { // update the progress bar
                        $(".progress").addClass("active");
                        $(".progress .bar").css("width", percentComplete + "%");
                    }
                },
                error: function (xhr, textStatus, thrownError) {
                    console.log(xhr.statusText);
                    console.log(xhr.responseText);
                    console.log(xhr.status);
                    console.log(thrownError);
                }
            });
        }, 3000);
    });
</script>

GetProgressBar は私が望むパーセンテージを私に与えますが、このメソッドは非同期メソッド ( ImportContact ) が彼の仕事を終えるのを待つので、うまくいきません...アップロードの最後にのみ進行状況バーの更新があります方法。

public ActionResult GetProgressBar()
{
    try
    {
        if (this.Session["test"] != null)
        {
            return Json(new { PercentComplete = this.Session["test"] }, JsonRequestBehavior.AllowGet);
        }
        else
            return Json(0, JsonRequestBehavior.AllowGet);
    }
    catch
    {
        ViewBag.Error = myApplication.Web.Resources.Views.Contact.Contact.ErrorMessage;
        return View();
    }

}

ご覧のとおり (最初に)、progressChanged イベントを実装しましたが、それを使用してビューの進行状況バーを更新する方法がわかりません... 助けてもらえますか?

これを読んで理解しようとしてくれてありがとう。さらに情報が必要な場合は教えてください。

4

1 に答える 1