2013-05-30 5 views
0

У меня есть этот метод в контроллере для сброса пароля пользователя по почте.JsonResult возвращает HTML-ответ

public JsonResult RecoverPasswordByEmail(string mail) 
    { 
     MembershipUser member = Membership.GetUser(Membership.GetUserNameByEmail(mail)); 
     string newPassword = System.Web.Security.Membership.GeneratePassword(14, 0); 

     member.UnlockUser(); 

     if (!member.ChangePassword(member.ResetPassword(), newPassword)) 
     { 
      return Json(new { Resultado = false, Excepcion = "Couldn't change password" }, JsonRequestBehavior.AllowGet); 
     } 

     System.Net.Mail.MailAddress from = new System.Net.Mail.MailAddress("[email protected]"); 
     System.Net.Mail.MailAddress to = new System.Net.Mail.MailAddress(mail); 
     System.Net.Mail.MailMessage message = new System.Net.Mail.MailMessage(from, to); 
     message.Subject = "Forgot pass"; 
     if (member.IsLockedOut) 
     { 
      message.Body = "You're locked"; 
     } 
     else 
     { 
      message.Body = "New password: " + newPassword; 
     } 
     var client = new System.Net.Mail.SmtpClient("my.smtpserver.com", 587) 
     { 
      Credentials = new System.Net.NetworkCredential("[email protected]", "12345"), 
      EnableSsl = true 
     }; 
     try 
     { 
      client.Send(message); 
     } 
     catch (System.Net.Mail.SmtpException ex) 
     { 
      return Json(new { Resultado = false, Excepcion = ex.Message }, JsonRequestBehavior.AllowGet); 
     } 
     return Json(new { Resultado = true }, JsonRequestBehavior.AllowGet); 
    } 

Я делаю запрос ajax с помощью jQuery с помощью кнопки в диалоговом окне из окна входа в систему.

Странно то, что я использую другой метод контроллера RecoverPassword, который делает то же самое, но по имени пользователя, и это работает. Используя firebug, я вижу, что RecoverPassword выполняет задание и возвращает результат JSON с результатом, но RecoverPasswordByEmail отвечает большим html-документом.

Важной частью HTML:

<div id="dialog"> 
    <h2>Retrieve Password</h2> 

    @Html.Label("Mail:")<br/> 
    @Html.TextBox("txtMail") 
    <div id="loading"> 
     <br/><img class="displayed" src="@Url.Content("~/Content/Images/Ajax/ajax-loader3.gif")" alt="loading" /><br/> 
     @Html.Label("Error") 
    </div> 
    <br/><br/><input class="button" id="btnSendMail" type="submit" value="Get new password" /> 

<div> 
     <a href="#" id="showDialog">Recuperar contraseña</a> 
    </div> 

</div> 

И в ЯШ:

$ (документ) .ready (функция() {

var requestMail; 
    $('#btnSendMail').button(); 
    $('#loading').hide(); 
    $("label[for=Error]").text(""); 

    $('#btnSendMail').click(function (event) { 
     event.preventDefault(); 
     var mail = $("#txtMail").val(); 
     if (mail.length > 0) { 
      if (requestMail && requestMail .readystate != 4) { 
       requestMail .abort(); 
      } 
      $('#loading').show(); 
      $('input[id="btnSendMail"]').attr('disabled', 'disabled'); 
      requestCorreo = $.ajax({ 
       url: '/Users/RecoverPasswordByEmail', 
       type: 'POST', 
       dataType: 'json', 
       contentType: "application/json; charset=utf-8", 
       timeout: 8000, 
       data: { Email: mail }, 
       success: function (response) { 
        if (response.Result) { 
         $("label[for=Error]").text('New password has been sent to: ' + mail); 
        } 
        else { 
         alert(response.Result + ' ' + response.Exception); 
        } 
       }, 
       error: function (xhr, textStatus, thrownError) { 
        if (textStatus === "timeout") { 
         alert("got timeout"); 
        } 
        else { 
         alert(xhr.status + ' ' + textStatus + ' ' + thrownError); 
        } 
       }, 
       complete: function() { 
        $('#loading').hide(); 
        $('input[id="btnSendMail"]').removeAttr('disabled'); 
       } 
      }); 
     } 
     else { 
      $("label[for=Error]").text("Insert a valid email"); 
     } 

     requestCorreo.done(function (msg) { 
      alert(msg); 
     }); 

     requestCorreo.fail(function (jqXHR, textStatus) { 
      alert("Request failed: " + textStatus + " " + jqXHR.responseText); 
     }); 
    }); 
}); 

ответ

0

Что находится в HTML, что что ваш метод бросает исключение, которое попадает на ASP.NET, и вместо этого вызывается страница с ошибкой, а не JsonResult из вашего метода.

Или это не так, содержимое HTML поможет пролить свет на проблему.

В качестве побочного примечания вы, кажется, не проверяете нигде в своем методе, и вы предполагаете, что членский член будет найден независимо от того, какой адрес электронной почты будет передан (что действительно может быть источником исключения).

+0

Я обновил сообщение, просто проигнорировал дополнительный код в js, там есть целая куча, поэтому я просто скопировал то, что, по моему мнению, связано с проблемой. – TheGman

+0

Я предполагаю, что HTML, который вы помещаете в свой пост, - это Razor из вашего файла вида, но какой HTML-код был возвращен из вашего запроса Ajax? – stevehayter

+0

Я думаю, что это будет перенаправление входа, которое реализует аутентификация форм, оно возвращает вид входа в систему как ответ. Теперь я не знаю, как я могу пройти этот механизм. – TheGman

Смежные вопросы