2013-11-17 3 views
0

У меня есть страница с формой контакта, расположенной внизу.Отправка электронной почты без обновления страницы

Что я пытаюсь достичь - отправьте электронное письмо с сайта без обратной связи, которое перезагрузит всю страницу и переместит клиента в начало страницы (форма «контакт-мы» находится внизу).

Вместо этого - клиент нажмет кнопку отправки, а затем появится какой-то жест, по которому была отправлена ​​почта.

Я знаю, как отправлять почту с помощью обычного подхода, что я пытаюсь выполнить, это отправить его с клиентской стороны с помощью jquery.ajax - это лучший способ для этого сценария?

Что я сделал, что стороне клиента:

$('#btnSubmit').on('click', function() {  
var fullName = $('#txt_fullName').val(); 
var fromEmail = $('#txt_email').val(); 
var comments = $('#txtArea_message').val(); 
var fromPhone = $('#txt_phone').val(); 
var data = "{'name': '" + name + "', 'fromEmail': '" + 
     fromEmail + "', 'comments': '" + comments + "', 'fromPhone': '" + fromPhone + "'}"; 

if (contactus == 0) { 
    $.ajax({ 
     type: "POST", 
     url: "Default.aspx/sentMail", 
     data: data, 
     contentType: "application/json; charset=utf-8", 
     dataType: "json" 
    }) 
}else if (contactus == 1) 
    return false; 
}) 

В стороне сервера у меня есть это:

tring sender_email = txt_email.Text; 
string sender_fullName = txt_fullName.Text; 
string sender_phone = txt_phone.Text; 
string sender_message = txtArea_message.Text; 

MailMessage MyMailMessage = new MailMessage(); 
MyMailMessage.From = new MailAddress("[email protected]", "Site"); 
MyMailMessage.To.Add("[email protected]"); 
MyMailMessage.Subject = "messge from site"; 
MyMailMessage.Body = "message"; 
MyMailMessage.IsBodyHtml = true; 
try 
{ 
    SmtpClient SMTPServer = new SmtpClient(); 
    SMTPServer.Send(MyMailMessage);   
} 

catch (Exception ex) 
{ 

} 

Это не работает - и я не знаете (почему я могу отлаживать это с помощью Google chrome?)

+0

где переменные данных? – K3rnel31

+0

Если вы уже знакомы с обычным подходом (и особенно если у вас уже есть рабочий код для этого), самым быстрым способом для этого было бы включить кнопку SEND и связанные элементы управления в UpdatePanel. Таким образом, вы сохраняете свой знакомый код и без каких-либо изменений кода избегаете полного обратного перевода страницы. –

+0

Запускаете ли вы это на сервере, на котором установлено действующее программное обеспечение для отправки почты? – adeneo

ответ

0

Рассмотрите возможность использования jquery для прокрутки вверху страницы aft er ajax-вызов завершен.

$.ajax({url: '/'}).done(function(data) {window.scrollTo(0,0);}); 
1

http://jsfiddle.net/uptownapps/QBvZu/

В этом примере, моя форма имеет id="contactForm", который, как я к нему доступ с JQuery.

// We are looking to intercept the "submit" event on the form 
    // whether that comes from a user clicking the "submit" button 
    // or hitting "enter" on their keyboard while on a form element. 
    $(document).on('submit', '#contactForm', function(event) { 

     // We are going to handle the interaction with the server ourselves 
     // so we want to prevent the browser from performing the default action 
     event.preventDefault(); 

     // serialize() on a from element will create the query string data 
     // like you would typically see in a GET request 
     // (i.e. "name=UptownApps&[email protected]" etc.) 
     var formData = $('#contactForm').serialize(); 

     $.ajax({ 

      // Send the request to the same place the form was originally going to 
      url: $('#contactForm').attr('action'), 

      // In this case I'm using POST. 'GET' is also acceptable. 
      type: 'POST', 

      // This callback function fires after successfully communicating 
      // with the server 
      success: function(data) { // data contains server's response 

       $('#contactForm').slideUp(400); // Hide the form 
       $('#successMessage').slideDown(400); // Show the success message 

      }, 

      // Error callback fires if there was an issue communicating with the server 
      // Or a non-200 HTTP status is returned 
      error: function(data) { // data contains server's response 

       $('#errorMessage').slideDown(400); // Show the error message 

      } 
     }); 

    }); 
+0

Не могли бы вы подробнее рассказать о процессе, поскольку я не подставил. –

+0

Извините (нажмите клавишу ввода - не удалось ее отредактировать). Можете ли вы, пожалуйста, подробнее рассказать о процессе, поскольку я не понимаю. serialize() - отправить обратно все элементы ввода и там значения в строке запроса обратно на сервер? Как я могу отладить это с помощью Google Chrome? можете ли вы направить мое письмо на хорошее руководство, описывающее, как это сделать, используя панель разработчика Google Chrome? и, пожалуйста, вы можете объяснить, что не хорошо в моем первоначальном посте. поскольку это не сработало. ответьте в своем оригинальном посте. Спасибо –

+0

Я добавил комментарии к своему коду. В вашем коде вы не препятствуете возникновению по умолчанию (браузер отправляет форму изначально). Вы также создаете данные JSON вручную, что не требуется. Вы также не определяете функцию успеха или отказа в вашем вызове .ajax. Я не знаю, как выглядит остальная часть вашего серверного кода, поэтому я не могу вам помочь. Надеюсь, это поможет. –

0

Общий ответ будет то, что вы бы добиться того, что с помощью AJAX и поэтому вы можете исследовать Microsoft ASP.NET AJAX. Однако, поскольку вы, как правило, понимаете это, но управляетесь по неправильному пути, вот несколько заметок.

Вы размещаете на странице Default.aspx/sentMail, что я не совсем уверен в том, как IIS обрабатывает его, но насколько я могу судить, он откроет Default.aspx и проигнорирует отправленную часть (она не отправит ее с параметр POST sentMail, поскольку он выглядит так, как вы ожидаете. Если вы хотите использовать этот подход, вам нужно будет отправить сообщение в Default.aspx (или любую другую страницу), но вам нужно будет установить параметр data для $.ajax как отметили here (найдите страницу для POST). Затем вместо отправленного вами кода на стороне сервера вам нужно будет получить переменные от POST, а не от элементов управления. Однако это не очень эффективный способ сделать этот тип поэтому я не буду вдаваться в подробности об этом.

Лучшим способом было бы сделать веб-сервис с помощью метода SendEmail и использовать его с использованием Microsoft ASP.NET AJAX. Это было бы намного проще, быстрее и чище.

Я также хотел бы добавить две заметки.

  1. Вы писались на стороне клиента, вы используете $('#btnSubmit'). Если вы используете прогностическое именование для элемента управления (кнопки), это нормально, но это не поведение по умолчанию, поэтому, если вы не знаете, вы должны использовать $('#<%= btnSubmit.ClientID %>') для идентификатора клиента элемента управления.
  2. Если вы открываете веб-службу для отправки электронных писем, каждый может просто позвонить ей, когда захочет, сколько раз они хотят, чтобы вы открыли все виды атак. Я предлагаю вам выполнить какую-либо проверку, возможно, сделать переменную (возможно, GUID) на странице, которую вы храните в сеансе, и сделать метод веб-службы проверкой, действительно ли отправленный параметр находится на сеансе перед отправкой почты. Обратите внимание, что вам нужно будет добавить атрибут EnableSession=true, как описано here, чтобы иметь возможность доступа к сеансу из веб-метода.
+0

Не могли бы вы объяснить, почему у меня есть использовать $ ('# <% = btnSubmit.ClientID%>')? если я поставил 'отладчик' в '$ (' # btnSubmit '). on (' click ', function() {debugger' - отладчик там останавливается .. и да, это странно, потому что это asp: button - doesn Предположим, у него есть другой идентификатор, когда он рендерируется? –

+0

ASP.NET работает таким образом, что он генерирует идентификаторы управления, поэтому они будут уникальными. Это означает, что когда вы называете свой элемент управления btnSubmit, у него не будет имени btnSubmit и поэтому вы получаете другой идентификатор. Более подробное объяснение можно найти на [сайте Microsoft] (http://msdn.microsoft.com/en-us/library/1d04y8ss (v = vs.100). ASPX). – Bikonja

+0

Я знаком с этим, но поскольку я написал «если я поставил« отладчик »в '$ (' # btnSubmit '). On (' click ', function() {debugger' - отладчик останавливается там. ", что означает, что идентификатор в порядке. Если я 'проверяю элемент (кнопку отправки), я вижу идентификатор как« btnSubmit ». Нет? –

0

Ваш клиент Javascript кажется хорошо, но было бы лучше, если бы вы сопоставить свойства объекта, как это на C#:

public class Mail 
{ 
public string FullName {get; set;} 
public string FromEmail {get; set;} 
public string ToEmail{get; set;} 
public string Comments {get; set;} 
public string FromPhone {get; set;} 
} 

И изменить JQuery для этого (карты свойств класса почты на ваш Просмотр ввода контента):

$('#btnSubmit').on('click', function() {  
     var fullName = $('#txt_fullName').val(); 
     var fromEmail = $('#txt_email').val(); 
     var comments = $('#txtArea_message').val(); 
     var fromPhone = $('#txt_phone').val(); 
     var data = { 
        FullName: fullname, 
        FromEmail: fromEmail, 
        Comments: comments, 
        FromPhone: fromPhone, 
        }; 

     if (contactus == 0) { 
      $.ajax({ 
       type: "POST", 
       url: "Default.aspx/sentMail", 
       data: data, 
       contentType: "application/json; charset=utf-8", 
       dataType: "json" 
      }) 
     }else if (contactus == 1) 
      return false; 
    }); 

и ваша функция на стороне сервера должен быть WebMethod и быть, как показано ниже:

[WebMethod] 
public string SentMail(Mail mail) 
{ 
    //use properties of Class Mail to send 
    MailMessage MyMailMessage = new MailMessage(); 
    MyMailMessage.From = new MailAddress("[email protected]", "Site"); 
    MyMailMessage.To.Add(mail.To); 
    MyMailMessage.Subject = mail.Comments; 
    MyMailMessage.Body = mail.Comments; 
    MyMailMessage.IsBodyHtml = true; 
    try 
    { 
     SmtpClient SMTPServer = new SmtpClient(); 
     SMTPServer.Send(MyMailMessage);   
    } 

    catch (Exception ex) 
    { 

    } 
    return ""; 
} 
Смежные вопросы