在多个控制器之间保留数据

时间:2014-07-02 20:15:15

标签: javascript asp.net-mvc-4 controller persist

我有一个登录表单(使用Html.BeginForm()创建),其中包含电子邮件字段,密码字段和“忘记密码?”内链接。最初,它是登录表单中的提交按钮,它将拦截SignIn操作。我想从SignIn操作中抽象出Forgot Password功能。

在这样做时,我注意到它是以这种方式设置的,以便将电子邮件字段值传递给忘记密码页面(因此用户不必重新输入它)。这被放入TempData

我的想法是对新的控制器操作进行AJAX调用:

    [HttpPost]
    [AllowAnonymous]
    public ActionResult ToForgotMyPassword(string email)
    {
        TempData["signInEmail"] = email;

        return Json(new { redirectUrl = Url.Action("ForgotMyPassword"), TempData = TempData, email = email });
    }

但我发现我的问题是TempData不会持续到下一个动作ForgotMyPassword。在我看来,我有以下JS:

$('#forgotPassword').click(function (e) {
    var forgotMyPasswordUrl = $(this).attr('href');
    e.preventDefault();

    $.ajax({
        type: "POST",
        url: '@Url.Action("ToForgotMyPassword")',
        data: { email: $('#Email').val() },
        dataType: "json",
        beforeSend: function (xhr) {
            console.log(xhr);
        },
        success: function (result) {
            //alert('Success');
            console.log(result);
            window.location = result.redirectUrl;
        },
        error: function (result) {
            alert('Error');
            console.log(result);
            //window.location = forgotMyPasswordUrl;
        }
    });
});

我如何将此TempData持久保存到重定向页面?我这样做的方式是不适合AJAX通话吗?我应该在登录表单中创建一个新模型和新表单吗?

1 个答案:

答案 0 :(得分:0)

我试着重复你的问题。在这里我做了什么:

控制器:

 [HttpPost]
 [AllowAnonymous]
 public ActionResult ToForgotMyPassword(string email)
 {
     TempData["signInEmail"] = email;

     return Json(new { redirectUrl = Url.Action("ForgotMyPassword")});
 }

 [HttpGet]
 [AllowAnonymous]
 public ActionResult ForgotMyPassword()
 {
     var email = TempData["signInEmail"];

     return View("Index", email);
 }

查看:

@model string
<html>
<head>
    <title>@Model</title>
</head>
 <body>
    <div>
        <input id="email" value="test@test.com"/>
        <button id="forgotPassword">forgotPassword</button>
    </div>
 </body>
</html>

<script>
  $('#forgotPassword').click(function (e) {

    e.preventDefault();

    $.ajax({
        type: "POST",
        url: '@Url.Action("ToForgotMyPassword")',
        data: { email: $('#email').val() },
        dataType: "json",
        beforeSend: function (xhr) {
            console.log(xhr);
        },
        success: function (result) {
            console.log(result);
            window.location = result.redirectUrl;
        },
        error: function (result) {
            alert('Error');
            console.log(result);
        }
    });
  });
</script>

所有这些都很好,所以我检查了两个理论: 1)如果您尝试发送TempData(下一个代码片段中的“TempData = TempData”)

Json(new { redirectUrl = Url.Action("ForgotMyPassword"), TempData = TempData, email = email });

TempData将被清除,它的集合中不会包含任何元素 2)如果您输入id =“email”并在脚本中使用$(“#Email”)。val() - 您什么也得不到。名称应该等于

我希望它有所帮助。