У меня есть этот метод в контроллере для сброса пароля пользователя по почте.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);
});
});
});
Я обновил сообщение, просто проигнорировал дополнительный код в js, там есть целая куча, поэтому я просто скопировал то, что, по моему мнению, связано с проблемой. – TheGman
Я предполагаю, что HTML, который вы помещаете в свой пост, - это Razor из вашего файла вида, но какой HTML-код был возвращен из вашего запроса Ajax? – stevehayter
Я думаю, что это будет перенаправление входа, которое реализует аутентификация форм, оно возвращает вид входа в систему как ответ. Теперь я не знаю, как я могу пройти этот механизм. – TheGman