Функция JsonResult внутри контроллера - PullRequest
0 голосов
/ 10 марта 2020

Я вызываю метод JsonResult SendEmail () в моем контроллере для управления процессом почтовой рассылки. Я хотел бы получить значения, возвращенные этим методом в моей функции Ajax, чтобы показать сообщения об успехе / ошибке, но это не работает. Response.message и Response.success кажутся пустыми. Что я делаю неправильно. Кажется, что контроллер не получил возвращенные значения от метода SendEmail ().

public class ContactController : Controller
{
    // GET: Contact
    [HttpGet]
    public ActionResult Index()
    {
        ViewBag.Title = "Contact us";
        ViewBag.MetaDescription = "";
        ViewBag.MetaKeywords = "";
        ViewBag.SiteName = "";
        ViewBag.CanonicalURL = "";
        ViewBag.Robots = "index, follow";

        return View();
    }

    [HttpPost]
    public ActionResult Index(ContactModel contact)
    {
        if (ModelState.IsValid)
        {
            //Email settings
            var recipient = "johndoe@outlook.com";
            var sender = contact.Email.ToString();
            var senderName = contact.Firstname + " " + contact.Lastname;
            var subject = "A new message from " + contact.Firstname + " " + contact.Lastname;
            var message = new StringBuilder();
            message.Append("Name: " + contact.Firstname + " " + contact.Lastname + "<br />");
            message.Append("Title: " + contact.Title + "<br />");
            message.Append("Company: " + contact.Company + "<br />");
            message.Append("Email: " + contact.Email + "<br />");
            message.Append("Telephone: " + contact.Phone + "<br /><br />");
            message.Append(contact.Message);

            //start email Thread
            var Email = new Thread(() =>
            SendEmail(recipient, sender, senderName, subject, message));
            Email.Start();
        }

        return View();

    }

    public JsonResult SendEmail(string recipient, string sender, string senderName, string subject, StringBuilder message)
    {
        try
        {
            using (var mail = new MailMessage())
            {
                mail.From = new MailAddress(sender, senderName);
                mail.To.Add(new MailAddress(recipient));
                mail.Subject = subject;
                mail.Body = message.ToString();
                mail.IsBodyHtml = true;

                try
                {
                    using (var smtpClient = new SmtpClient("smtp.office365.com", 587))
                    {
                        smtpClient.EnableSsl = true;
                        smtpClient.UseDefaultCredentials = false;
                        smtpClient.Credentials = new System.Net.NetworkCredential("johndoe@outlook.com", "password");
                        smtpClient.Send(mail);                            
                    }
                }
                finally
                {
                    // Dispose the client
                    mail.Dispose();
                }
            }

            return Json(new ContactModelResponse { Success = "alert-success", Message = "Success" });

        }
        catch (SmtpFailedRecipientsException ex)
        {
            for (int i = 0; i < ex.InnerExceptions.Length; i++)
            {
                SmtpStatusCode status = ex.InnerExceptions[i].StatusCode;
                if (status == SmtpStatusCode.MailboxBusy ||
                    status == SmtpStatusCode.MailboxUnavailable)
                {
                    Console.WriteLine("Delivery failed - retrying in 5 seconds.");
                    //Retry
                    //System.Threading.Thread.Sleep(5000);
                    //smtpClient.Send(mail);
                }
                else
                {
                    Console.WriteLine("Failed to deliver message to {0}", ex.InnerExceptions[i].FailedRecipient);
                }
            }

            return Json(new ContactModelResponse { Success = "alert-danger", Message = "Error" });
        }
        catch (SmtpException Se)
        {
            // Handle exception
            Console.WriteLine(Se.ToString());
            return Json(new ContactModelResponse { Success = "alert-danger", Message = "Error" });
        }

        catch (Exception ex)
        {
            Console.WriteLine(ex.ToString());
            return Json(new ContactModelResponse { Success = "alert-danger", Message = "Error" });
        }
    }
}

JS

$('.contact-form').each(function () {
    $(this).validate({
        errorPlacement: function (error, element) {
            if (element.attr("name") == "department")
                error.insertBefore($("fieldset").first());
            else
                error.insertAfter(element);
        },
        submitHandler: function (form) {
            var $form = $(form);

            // Ajax Submit
            $.ajax({
                type: 'POST',
                url: $form.attr('action'),
                data: $form.serialize()
            }).done(function (response) {
                $form.find('.form-control').val('').blur().parent().removeClass('has-success').removeClass('has-danger').find('label.error').remove();
                $form.find('input:radio, input:checkbox').removeAttr('checked').removeAttr('selected');
                $form.find('.form-control').removeClass('error');
                $('#contactResult').html(response.Message);
                $('#contactResult').addClass(response.Success);
                $('#contactResult').removeClass('d-none');
            });
        }
    });
}); 
...