如何对控制器操作进行ajax调用

时间:2017-12-06 11:13:04

标签: ajax asp.net-mvc asp.net-mvc-5 asp.net-identity

这是我的第一个Ajax调用,我真的很困惑该怎么做。

我正在使用ASP.NET MVC,Identity在我的网站上注册用户。用户注册后,我会向他发送电子邮件以确认他们的电子邮件地址。

这是我的注册操作方法:

    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Register(RegisterViewModel model)
    {
        if (ModelState.IsValid)
        {
            var user = new ApplicationUser { UserName = model.Email.Trim(), Email = model.Email.Trim(), FirstName = model.FirstName.Trim(), LastName = model.LastName.Trim() };
            var result = await UserManager.CreateAsync(user, model.Password);
            if (result.Succeeded)
            {
                // Send an email with this link
                string code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);
                var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);
                Email email = _emailBuilder.BuildConfirmationEmail(new MailAddress(model.Email.Trim(), model.FirstName.Trim() + " " + model.LastName.Trim()), callbackUrl, model.FirstName.Trim());
                Session[SessionKeys.NewAccountConfirmationEmail.ToString()] = email;
                await _emailService.SendEmailAsync(email);

                return RedirectToAction("NewAccountCheckYourEmail");
            }
            AddErrors(result);
        }

        // If we got this far, something failed, redisplay form
        return View(model);
    }

注册方法发送确认电子邮件并重定向到NewAccountCheckYourEmail View,用户可以看到此页面:

enter image description here

以下是重定向用户以确认您的电子邮件页面的操作方法

[AllowAnonymous]
public ViewResult NewAccountCheckYourEmail()
{
    return View();
}

我想要做的是将电子邮件存储在用户会话中,因此如果用户点击重发电子邮件,我会重新发送电子邮件。

我想进行ajax调用,因此当用户点击重新发送链接时,它会回发到控制器,从用户会话中获取电子邮件,重新发送并重新显示相同的视图。

我不知道该怎么做

我厌倦了这个AJAX电话:

$("#ResendEmailLink").click(function () {
$.ajax({
    url: "/Account/NewAccountCheckYouEmail",
    datatype: "text",
    type: "POST",
    success: function (data) {
        $('#testarea').html("All OK");
    },
    error: function () {
        $("#testarea").html("ERROR");
    }
});

});

我想让它点击这个动作方法:

  [HttpPost]
    [AllowAnonymous]
    public async Task<ActionResult> NewAccountCheckYourEmail()
    {
        Email email = Session[SessionKeys.NewAccountConfirmationEmail.ToString()] as Email;
        await _emailService.SendEmailAsync(email);
        return View();
    }

但是因为我已经有了另一个同名的Action方法,所以我无法添加它...我想我想要做的事情没有多大意义,有任何关于合理方法的建议吗?

1 个答案:

答案 0 :(得分:3)

由于@Stephen Muecke指出要返回Json数据,所以这个基本的改变应该有效。

重新发送电子邮件脚本:

$("#ResendEmailLink").click(function () {
$.ajax({
    url: "/Account/ResendEmailToUser",
    datatype:'json',
    type: "POST",
    success: function (data) {

if(data) { $('#testarea').html(data.Message) };

    },
    error: function () {
        $("#testarea").html("ERROR");
    }
});

});

重新发送电子邮件操作方法:

[HttpPost]
[AllowAnonymous]
public async Task<ActionResult> ResendEmailToUser()
{

Email email = Session[SessionKeys.NewAccountConfirmationEmail.ToString()] as Email;
await _emailService.SendEmailAsync(email);

var jsonData = new { Message = "Done!, We have Resend the Email" };

return Json(jsonData);

}