如何向用户表明SmtpClient表单正在做某事(主要是IE)

时间:2013-08-21 14:48:51

标签: c# asp.net

我使用asp.net和C#发送电子邮件。 使用它们的id检索表单的值,并使用SmtpClient.send()发送,这一切都正常。

我想知道的是,一旦您点击发送以便用户不会感到不耐烦或误解等,如何表明某些事情确实发生了。

该网站主要通过Microsoft Connect中的页面查看器进行查看,因此他们将无法在选项卡上看到加载图标。 在Chrome中,指针会变为显示旋转的圆圈,这很棒,但使用IE时根本没有任何指示。 我尝试用加载gif替换表单所在的div的内容,但它只在发送电子邮件(或发送失败)后才会发生,并且如果他们想要发送新的电子邮件,它会持续存在再次替换表格内容,这似乎是一个faff,这就是为什么我要问可能的方法是什么。

4 个答案:

答案 0 :(得分:0)

我在表单提交时以不确定的状态打开一个带有jQueryUI ProgressBar的jQueryUI对话框。一旦浏览器发送请求,它就会出现;然后,您的回复可以重定向到确认页面,说明他们的电子邮件已发送。或者,如果您正在执行AJAX请求以在服务器上启动发送,则可能只关闭对话框并在当前页面上显示消息。

答案 1 :(得分:0)

开始一个新线程直接发送您的电子邮件,无需等待。

答案 2 :(得分:0)

好的,所以我把它排序了。基本上在提交按钮上我添加了OnClientClick并通过将图像标记添加到表单来通过jQuery完成。因为每次单击按钮时都会创建表单(因为内容取决于单击的按钮),所以在发送电子邮件后图像不存在。在发送电子邮件后保留的代码中添加图像标记时,情况并非如此。

总结一下:

<asp:button runat="server" text="Submit" onclick="code_behind_function" onclientclick="javascriptfunction()"/>

答案 3 :(得分:-1)

使用SMTPClient.SendAsync在后台发送邮件。创建一个事件处理程序,以捕获发送邮件的回调何时完成,然后隐藏您的微调器。

E.g。

// Code to show your spinning circle goes here
client.SendCompleted += new 
        SendCompletedEventHandler(SendCompletedCallback);
...


private static void SendCompletedCallback(object sender, AsyncCompletedEventArgs e)
    {
        // Code to hide your spinning circle goes here!
    }

这是一个使用javascript来显示图像,然后将其隐藏在后面的代码中的工作示例。不需要发送异步。 (错误处理省略)

sendmail.aspx页面:

<body>
    <form id="form1" runat="server">
        <div>
            From: <asp:TextBox ID="txtFrom" runat="server"></asp:TextBox><br />
            To: <asp:TextBox ID="txtTo" runat="server"></asp:TextBox>
        </div>
        <div id="spinner_div">
            <asp:Image ID="imgSpinner" runat="server" ImageUrl="~/Images/ajax-loader.gif"></asp:Image>
        </div>
        <input type="button" onclick="document.getElementById('imgSpinner').style.display = ''; document.forms[0].submit();" value="Send Mail" />
    </form>
</body>

sendmail.aspx.cs

public partial class Sendmail : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        imgSpinner.Attributes.Add("style", "display:none");

        if (IsPostBack)
        {
            System.Net.Mail.SmtpClient client = new System.Net.Mail.SmtpClient();
            client.Send(new System.Net.Mail.MailMessage(txtFrom.Text, txtTo.Text));
        }
    }
}