跟踪数据库的进度保存在“实时”进度条中 asp.net mvc

2024-02-08

我需要显示 .net 4.5 中 SQL 加载的进度。目的是显示正在发生的上传的“实时”流程。以便上传信息​​的人可以看到上传正在运行。

控制器方法:

private void ProgressUpload(int? SystemGeneralAnnouncementId) {

                var systemGeneralAnnouncement = (SystemGeneralAnnouncementId == null) ? null : _uow.SystemGeneralAnnouncementRepository.GetById(SystemGeneralAnnouncementId.Value);
                List<Status> status = new List<Status>();

                if (systemGeneralAnnouncement.Statuses.Length > 0)
                {
                    status.AddRange(systemGeneralAnnouncement.Statuses.Split(',').Select(item => (Status)Enum.Parse(typeof(Status), item)));
                }

                var allEmailAddresses = new List<PointOfContact>();
                var EmailAddresses = new List<PointOfContact>();

                //retrieve all Point of contact based upon selected statuses per each loop
                var result = new List<PointOfContact>();
                foreach (var item in status)
                {
                    result = _uow.PointOfContactRepository.GetAllByStatus(item).ToList();
                    allEmailAddresses.AddRange(result);
                }

                // Retrieve the email addresses based on the who is intended to receive the email message
                if (systemGeneralAnnouncement.SendToRecipients.Contains("(1) All Three Contacts"))
                {
                    EmailAddresses = allEmailAddresses;
                }
                else
                {
                    if (systemGeneralAnnouncement.SendToRecipients.Contains("(2) All first Contacts"))
                    {
                        pocEmailAddresses.AddRange(allEmailAddresses.Where(r => r.PointOfContactType == PointOfContactTypes.Primary).ToList());
                    }
                    if (systemGeneralAnnouncement.SendToRecipients.Contains("(3) All Second Contacts"))
                    {
                        pocEmailAddresses.AddRange(allEmailAddresses.Where(r => r.PointOfContactType == PointOfContactTypes.Secondary).ToList());
                    }
                    if (systemGeneralAnnouncement.SendToRecipients.Contains("(4) All third contacts"))
                    {
                        pocEmailAddresses.AddRange(allEmailAddresses.Where(r => r.PointOfContactType == PointOfContactTypes.SigningAuthority).ToList());
                    }
                    if (systemGeneralAnnouncement.SendToRecipients.Contains("(5) All fourth Contacts"))
                    {
                        pocEmailAddresses.AddRange(allEmailAddresses.Where(r => r.PointOfContactType == PointOfContactTypes.TuitionRates).ToList());
                    }
                    if (systemGeneralAnnouncement.SendToRecipients.Contains("(6) Specified Email Address"))
                    {
                        var pocs = new List<PointOfContact>();

                        string[] emails = systemGeneralAnnouncement.EmailAddresses.Split(',');

                        foreach (string email in emails)
                        {
                            var addPoc = new PointOfContact { Email = email };

                            User user = _uow.UserRepository.GetByEmail(email);

                            if (user == null)
                            {
                                add.FirstName = "Not Created Account Yet";
                            }
                            else
                            {
                                addPoc.FirstName = user.FirstName;
                                addPoc.LastName = user.LastName;
                            }

                            List<PointOfContact> idAssociatedToUser =
                                _uow.PointOfContactRepository
                                    .GetAllPocsByEmail(email)
                                    .ToList();


                            if (idAssociatedToUser.Count == 0)
                            {
                                addPoc.IDNumber = "N/A";
                            }
                            else
                            {
                                string[] idArray = idAssociatedToUser
                                    .Select(x => x.IDNumber)
                                    .ToArray();

                                addPoc.IDNumber = string.Join(",", opeidArray);
                            }
                            pocs.Add(addPoc);
                        }
                        EmailAddresses.AddRange(pocs);
                    }
                }
                // if any poc addresses were found...
                if (EmailAddresses.Count > 0)
                {
                    string emailBody = WebUtility.HtmlDecode(systemGeneralAnnouncement.EmailBody);

                    foreach (PointOfContact emailAddress in EmailAddresses.Where(x => x.Email != "" && x.Email != null).ToList())
                    {
                        string firstName = emailAddress.FirstName == null ? "" : emailAddress.FirstName.Trim();
                        string lastName = emailAddress.LastName == null ? "" : emailAddress.LastName.Trim();
                        string userName = firstName + " " + lastName;

                        //Below I Used SqlCommand vs EF because EF has AutoDetectChangesEnabled and it slows things down when adding to the context. Instead of tuning it by turning it to false or 
                        //configure it to use AddRange, SqlCommand is the best option for speed.

保存到数据库:

SaveToDatabase(emailAddress.Email, emailBody, systemGeneralAnnouncement.Subject, UserIdentityHelper.GetUserEmailAddress + " (" + UserIdentityHelper.GetUserId + ")", systemGeneralAnnouncement.SystemGeneralAnnouncementId, userName, emailAddress.IDNumber);

    LogInstitutionEmail(systemGeneralAnnouncement.Subject, emailBody, emailAddress.Email, emailAddress.IDNumber, systemGeneralAnnouncement.EmailAttachmentLocation);
                }
            }
        }

        private void LogInstitutionEmail(string subject, string emailBody, string email, string opeidNumber, string emailAttachment)
        {
            try
            {
                using (var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["MasterContext"].ConnectionString))
                {
                    conn.Open();
                    SqlCommand cmd;
                    if (string.IsNullOrEmpty(emailAttachment))
                    {
                        cmd = new SqlCommand("Insert Into Emails (Since, Subject, Email, EmailAddress, OpeidNumber, FirstReadDateTime) VALUES(@Since, @Subject, @Email, @EmailAddress, @OpeidNumber, NULL)", conn);
                    }
                    else
                    {
                        cmd = new SqlCommand("Insert Into Emails (Since, Subject, Email, EmailAddress, OpeidNumber, FirstReadDateTime, Attachment) VALUES(@Since, @Subject, @Email, @EmailAddress, @IDNumber, NULL, @Attachment)", conn);
                        cmd.Parameters.Add(new SqlParameter() { ParameterName = "@Attachment", Value = emailAttachment });
                    }


                    cmd.Parameters.Add(new SqlParameter() { ParameterName = "@Since", Value = DateTime.Now });
                    cmd.Parameters.Add(new SqlParameter() { ParameterName = "@Subject", Value = subject });
                    cmd.Parameters.Add(new SqlParameter() { ParameterName = "@Email", Value = emailBody });
                    cmd.Parameters.Add(new SqlParameter() { ParameterName = "@EmailAddress", Value = email });
                    cmd.Parameters.Add(new SqlParameter() { ParameterName = "@idNumber", Value = idNumber });
                    cmd.CommandType = CommandType.Text;

                    cmd.ExecuteNonQuery();
                    conn.Close();
                }
            }
            catch (Exception ex)
            {
                Elmah.ErrorSignal.FromCurrentContext().Raise(ex);
            }
        }

        private void SaveToDatabase(string emailRecipient, string emailBody, string subject, string userWhoSentIt, int systemGeneralAnnouncementId, string userName, string opeidNumber)
        {
            try
            {
                using (var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["MasterContext"].ConnectionString))
                {
                    conn.Open();
                    var cmd = new SqlCommand("Insert Into EmailQueue (EmailRecipients, EmailBody, EmailSubject, UserWhoSentIt, QueueDate, SystemGeneralAnnouncementId, UserName, OpeidNumber) VALUES(@EmailRecipients, @EmailBody, @EmailSubject, @UserWhoSentIt, @QueueDate, @SystemGeneralAnnouncementId, @UserName, @OpeidNumber)", conn);
                    cmd.CommandType = CommandType.Text;
                    cmd.Parameters.Add(new SqlParameter() {ParameterName = "@EmailRecipients", Value = emailRecipient });
                    cmd.Parameters.Add(new SqlParameter() { ParameterName = "@EmailBody", Value = emailBody });
                    cmd.Parameters.Add(new SqlParameter() { ParameterName = "@EmailSubject", Value = subject });
                    cmd.Parameters.Add(new SqlParameter() { ParameterName = "@UserWhoSentIt", Value = userWhoSentIt });
                    cmd.Parameters.Add(new SqlParameter() { ParameterName = "@QueueDate", Value = DateTime.Now });
                    cmd.Parameters.Add(new SqlParameter() { ParameterName = "@SystemGeneralAnnouncementId", Value = systemGeneralAnnouncementId });
                    cmd.Parameters.Add(new SqlParameter() { ParameterName = "@UserName", Value = userName });
                    cmd.Parameters.Add(new SqlParameter() { ParameterName = "@idNumber", Value = idNumber });


                    cmd.ExecuteNonQuery();
                    conn.Close();
                }
            }
            catch (Exception ex)
            {
                Elmah.ErrorSignal.FromCurrentContext().Raise(ex);
            }
        }

调用Post方法的视图:

@model DODMOU.Model.Entities.SystemGeneralAnnouncement
@{
    ViewBag.Title = "Send Email";
    Layout = "~/Views/Shared/_AdministratorLayout.cshtml";
}
<div class="title">
    <h2>Send Email</h2>
</div>
<hr />
<div class="title">
    <h2>Are you sure you want to Send this Email?</h2>
</div>
<div class="row">
    <div class="col-sm-offset-2 col-sm-9">
        <table class="table table-striped table-hover table-bordered table-responsive">
            <tr>
                <th scope="row" class="col-md-1">@Html.DisplayNameFor(model => model.SendToRecipients) :</th>
                <td class="col-md-8">@Html.DisplayFor(model => model.SendToRecipients)</td>
            </tr>
            <tr>
                <th scope="row">@Html.DisplayNameFor(model => model.Subject) :</th>
                <td>@Html.DisplayFor(model => model.Subject)</td>
            </tr>
            <tr>
                <th scope="row">@Html.DisplayNameFor(model => model.EmailBody) :</th>
                <td class="col-sm-8">@MvcHtmlString.Create(HttpUtility.HtmlDecode(Model.EmailBody))</td>
            </tr>
            <tr>
                <th scope="row">@Html.DisplayNameFor(model => model.Since) :</th>
                <td>@Html.DisplayFor(model => model.Since)</td>
            </tr>
        </table>
    </div>
    <div class="row col-sm-offset-2 col-sm-9 text-right">
        <div class="row col-sm-offset-2 col-sm-9 text-right">
            @using (Html.BeginForm("ConfirmSend", "SystemGeneralAnnouncement", FormMethod.Post))
            {
                @Html.AntiForgeryToken()
                @Html.HiddenFor(model => model.SystemGeneralAnnouncementId)
                <div class="form-actions no-color">
                    <input type="submit" value="Send" class="btn btn-primary" /> |
                    @Html.ActionLink("Back to List", "Index")
                </div>
            }
        </div>

    </div>
</div>

接收上传信息的视图:

<div class="col-xs-12" style="text-align: center">
    <p>
        <div class="alert alert-success Loading">
            <h2 class="title">General Announcement is Loading...</h2>
            <br />
        </div>
        The selected general announcements are being uploaded...<br />
        <div class="progress"> <div class="progress-bar" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width: 0%;"></div> </div>
        @Html.ActionLink("Return to the System General Announcement page.", "Index", "SystemGeneralAnnouncement")
    </p>
    <div id="success" style="display:none">
        <div class="alert alert-success">
            <h2 class="title">General Announcement Successfully Generated!</h2>
        </div>
        The selected general announcement has been successfully generated and will begin sending to the appropriate recipients within the next few minutes.<br />
        @Html.ActionLink("Return to the System General Announcement page.", "Index", "SystemGeneralAnnouncement")
    </div>
</div>
@section scripts{
    <script>
        $.ajax({
            type: 'POST',
            url: "ProgressUpload, systemGeneralAnnouncement",
            data: {},
            success: function (data) {
                $(".Loading").hide();
                $("#success").css("display","block");
            },
            xhr: function () {
                var xhr = new window.XMLHttpRequest();
                xhr.upload.addEventListener("progress", function (evt) {
                    if (evt.lengthComputable) {
                        var percentComplete = evt.loaded / evt.total;

                    }
                }, false);

                return xhr;
            },

        });
    </script>
    }

如上所述,这里的最终目标是让用户在上传文件时在页面上看到“实时”进度。成功返回将在 100% 后显示,让他们知道上传已完成。

我的问题是,我缺少什么来公开要上传的当前值?它应该来自事件监听器,但不显示任何上传进度。


我建议使用 SignalR 将进度数据更新到客户端。 假设您的上传数据是IEnumerable类型,您需要在 foreach 循环中捕获每次对数据库的更新,并使用 SignalR 将数据更新到客户端。

请参阅此链接:https://www.codeproject.com/Articles/1124691/SignalR-Progress-Bar-Simple-Example-Sending-Live-D https://www.codeproject.com/Articles/1124691/SignalR-Progress-Bar-Simple-Example-Sending-Live-D

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

跟踪数据库的进度保存在“实时”进度条中 asp.net mvc 的相关文章

  • 在 C# 中生成 HMAC-SHA1

    我正在尝试使用 C 来使用 REST API API 创建者提供了以下用于 hmac 创建的伪代码 var key1 sha1 body var key2 key1 SECRET KEY var key3 sha1 key2 var sig
  • (const T v) 在 C 中从来都不是必需的,对吗?

    例如 void func const int i 在这里 const是不必要的 因为所有参数都是按值传递的 包括指针 真的吗 C 中的所有参数确实都是按值传递 这意味着无论您是否包含该参数 实际参数都不会改变const or not 然而
  • C# 正则表达式用于查找 中具有特定结尾的链接

    我需要一个正则表达式模式来查找字符串 带有 HTML 代码 中的链接 以获取文件结尾如 gif 或 png 的链接 示例字符串 a href site com folder picture png target blank picture
  • 带 If 的嵌套 For 循环的时间复杂度

    void f int n for int i 1 i lt n i if i int sqrt n 0 for int k 0 k lt pow i 3 k do something 我的思考过程 执行if语句的次数 sum i 1 to
  • 如何生成 appsettings..json 文件?

    我有一个 ASP NET Core 2 WebAPI 它将部署在以下环境中 INT QA STAGE 生产环境 基于上述 我需要有appsettings
  • 对 boost 库的依赖项没有完整路径

    我已经成功构建了动态库 依赖于使用自定义前缀构建和安装的 boost 库 b2 install prefix PREFIX 然而 当我跑步时otool L在我的库中 我得到如下输出 libboost regex dylib compatib
  • 将带有 glut 的点击坐标添加到向量链接列表中

    我想创建一个向量链接列表 并在 GLUT 库的帮助下获取点击的位置并将它们附加到链接列表中 这些是我写的结构 typedef struct vector int x int y Vector typedef struct VectorLis
  • 如何在 C++ 中将 CString 转换为 double?

    我如何转换CString to a double在 C 中 Unicode 支持也很好 Thanks A CString可以转换为LPCTSTR 这基本上是一个const char const wchar t 在 Unicode 版本中 知
  • libxml2 xmlChar * 到 std::wstring

    libxml2似乎将所有字符串存储在 UTF 8 中 如xmlChar xmlChar This is a basic byte in an UTF 8 encoded string It s unsigned allowing to pi
  • 预处理后解析 C++ 源文件

    我正在尝试分析c 使用我定制的解析器的文件 写在c 在开始解析之前 我想摆脱所有 define 我希望源文件在预处理后可以编译 所以最好的方法是运行C Preprocessor在文件上 cpp myfile cpp temp cpp or
  • 默认析构函数做了多少事情

    C 类中的默认析构函数是否会自动删除代码中未显式分配的成员 例如 class C public C int arr 100 int main void C myC new C delete myC return 0 删除 myC 会自动释放
  • 分配器感知容器和propagate_on_container_swap

    The std allocator traits模板定义了一些常量 例如propagate on container copy move assign让其他容器知道它们是否应该在复制或移动操作期间复制第二个容器的分配器 我们还有propag
  • 如何随着分辨率的变化自动调整大小和调整表单控件

    我注意到某些应用程序会更改控件的位置以尽可能适应当前的分辨率 例如 如果窗口最大化 则控件的设置方式应使整个 GUI 看起来平衡 是否可以使用 C 在 Visual studio 2010 中制作或实现此功能 Use Dock http m
  • ASP.NET JQuery AJAX POST 返回数据,但在 401 响应内

    我的应用程序中有一个网页 需要调用我设置的 Web 服务来返回对象列表 这个调用是这样设置的 document ready function var response ajax type POST contentType applicati
  • 0-1背包算法

    以下 0 1 背包问题是否可解 浮动 正值和 浮动 权重 可以是正数或负数 背包的 浮动 容量 gt 0 我平均有 这是一个相对简单的二进制程序 我建议用蛮力进行修剪 如果任何时候你超过了允许的重量 你不需要尝试其他物品的组合 你可以丢弃整
  • 初始化 LPCTSTR /LPCWSTR [重复]

    这个问题在这里已经有答案了 我很难理解并使其正常工作 基本上归结为我无法成功初始化这种类型的变量 它需要有说的内容7 2E25DC9D 0 USB003 有人可以解释 展示这种类型的正确初始化和类似的值吗 我已查看此站点上的所有帮助 将项目
  • ASP.NET 中 HTTP 缓存相关标头的有效含义

    我正在 ASP NET 2 0 中开发一个 Web 应用程序 其中涉及通过资源处理程序 ashx 提供图像 我刚刚实现了处理缓存标头和条件 GET 请求 这样我就不必为每个请求提供所有图像 但我不确定我是否完全理解浏览器缓存发生了什么 图像
  • 为什么文件更新时“如果较新则复制”不复制文件?

    我在 Visual Studio Express 中有一个解决方案 如下所示 The LogicSchemaC 中的类 将在运行时解析指定的 XML 文件 以下是在main的方法Program cs LogicSchema ls new L
  • ASP.NET Core 会话超时

    我记得我们在 ASP NET 中使用了 session timeout 来更改会话超时 如果不更改 则为 20 分钟 我尝试在 Startup cs 中更改 ASP NET Core 3 1 中的会话超时 但没有任何反应 我对操作员使用身份
  • 服务器响应 PASV 命令返回的地址与建立 FTP 连接的地址不同

    System Net WebException 服务器响应 PASV 命令返回的地址与建立 FTP 连接的地址不同 在 System Net FtpWebRequest CheckError 在 System Net FtpWebReque

随机推荐