跨多个控制器持久化数据

Persist data across multiple controllers

本文关键字:持久化 数据 控制器      更新时间:2023-09-26

我有一个登录表单(用Html.BeginForm()创建(,里面有一个电子邮件字段、密码字段和一个"忘记密码?"链接。最初,它是登录表单中的一个提交按钮,它会拦截SignIn操作。我想从登录操作中提取忘记密码功能。

在这样做的过程中,我注意到它是这样设置的,目的是将电子邮件字段值传递到"忘记密码"页面(这样用户就不必重新输入(。这被放入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调用?我应该在登录表单中创建一个新模型和新表单吗?

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

控制器:

 [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((,您将一无所获。名称应等于

我希望它能有所帮助。