我有一个登录表单(使用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通话吗?我应该在登录表单中创建一个新模型和新表单吗?
答案 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() - 您什么也得不到。名称应该等于
我希望它有所帮助。