0

我在控制器中有这种方法来通过邮件重置用户的密码。

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("foo@bar.com");
        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("foo@bar.com", "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);
    }

我使用 jQuery 从登录视图的对话框中的按钮执行 ajax 请求。

奇怪的是,我使用了另一个控制器方法 RecoverPassword,它做同样的事情,但使用用户名并且有效。使用萤火虫,我看到 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>

和js:

$(文档).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);
        });
    });
});
4

1 回答 1

0

返回的 HTML 中有什么内容?我敢打赌,您的方法正在引发异常,该异常被 ASP.NET 捕获,并且返回的是错误页面,而不是您方法中的 JsonResult。

否则,HTML 的内容将有助于更清楚地说明这个问题。

作为旁注,您似乎没有在您的方法中的任何地方检查 null - 而且您假设无论传递什么电子邮件地址都会找到 MembershipUser (这可能确实是您的异常的来源)。

于 2013-05-30T22:39:40.947 回答