我有一个控制器,该控制器发送电子邮件,并向我的ajax脚本返回“成功” json响应。
控制器如下所示:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult EmailSend(string input1)
{
EmailSignup person = new EmailSignup { emailhasbeensent = false, Email = input1 };
try
{
SmtpClient client = new SmtpClient("smtp.gmail.com", 587);
client.EnableSsl = true;
client.UseDefaultCredentials = false;
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.Credentials = new NetworkCredential("Email", "PW");
MailMessage message = new MailMessage();
message.From = new MailAddress("Email");
message.To.Add(person.Email);
message.Subject = "Thank you for subscribing";
message.Body = "You have now subscribed for our newsletter";
message.IsBodyHtml = true;
client.Send(message);
person.emailhasbeensent = true;
return Json(new { status = "success" });
}
catch (Exception ex)
{
return Json(new { status = "error" });
}
}
不幸的是,在发送成功响应之前会有一个延迟,这意味着在接收到成功响应之前,正在其中输入电子邮件的页面有点“空”。
有没有一种方法可以加快此过程,以便立即发送响应?如果不是,是否可以实现加载栏,以向用户显示“幕后”正在发生什么?
理想情况下,您应该考虑将耗时的过程移出UI线程,并将此工作转移到其他过程。例如,您可以将此信息(对于toAddress
您的情况,为电子邮件所需要的最少信息)发送到队列,其他进程将从该队列中读取并发送电子邮件。正确使用跨国队列还可以确保容错能力。
另一个解决方案是将这项工作从ThreadPool交给另一个线程,以便您的UI线程无需等待代码完成执行即可。很难跟踪其他线程何时未能成功完成操作!
private void SendEmail(string emailAddress)
{
// Your existing code to send email goes here
// Make sure you handle(LOG) exceptions
}
[HttpPost]
public ActionResult EmailSend(string input1)
{
try
{
// Have another thread executes the SendEmail method
Task.Run(() => { SendEmail(input1); });
return Json(new { status = "success" });
}
catch (Exception ex)
{
//to do : LOG exceptions
return Json(new { status = "error" });
}
}
现在,如果您不想执行所有这些操作,则可以在客户端显示一些“正在加载”消息,以便用户知道正在发生的事情。下面的示例将按钮文本更改为“请稍候...”。并禁用该按钮,以便用户在我们从ajax调用返回响应之前不会再次单击它。
$(function () {
$("#emailSignup").click(function (e) {
e.preventDefault();
var _this = $(this);
_this.text("Please wait...").attr("disabled", "disabled");
$.ajax({
type: 'POST',
url: "@Url.Action("EmailSend", "Home")",
data: { input1: "Some value" },
}).done(function (res) {
if (res.status === "success") {
$("#MailFoot").hide();
$("#ty").show();
}
else {
_this.text("Please wait...").removeAttr("disabled");
alert("Error sending email");
}
});
});
})
除了简单地更新按钮文本,您还可以做任何您想做的事情!也许显示进度条?微调器?只需在页面中保留一个微调器图像(最初隐藏),并在ajax调用开始/结束/时根据需要显示/隐藏
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句