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 を使用し、それが機能することです。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>

そしてjs:

$(document).ready(function () {

    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 に答える