我目前正在处理项目中的用户注册。注册完成后,我希望向用户显示一些确认。我决定创建另一个视图。没关系。
现在,如果在注册后我只返回视图:
public class MyController : Controller
{
[AcceptVerbs (HttpVerbs.Post), ValidateAntiForgeryToken]
public ActionResult Registration (FormCollection form)
{
/* Some logic goes here */
return View ("ConfirmationView");
}
}
一切都按预期工作。标题栏中没有更改的网址。但是......如果我点击刷新按钮,浏览器将再次从表单中提交我不想要的数据。
然后我决定创建一个单独的动作,但这意味着它将在地址栏中生成一个新的URL。我不希望用户立即单击刷新,因为此视图将无法再次显示确认信息。有没有办法让行动无法直接访问?或者至少是确定是直接调用还是通过重定向调用的方法?在后一种情况下,我只是将用户从该页面带到主页。
有什么方法可以实现这个目标吗?
答案 0 :(得分:3)
所以我自己找到了解决方案。
可以使用TempData来检测重复或外部动作调用。
public class MyController : Controller
{
[AcceptVerbs (HttpVerbs.Post), ValidateAntiForgeryToken]
public ActionResult Registration (FormCollection form)
{
/* Some logic goes here */
TempData["RedirectCall"] = true;
return RedirectToAction ("Confirmation");
}
[AcceptVerbs (HttpVerbs.Get)]
public ActionResult Confirmation ()
{
if (TempData["RedirectCall"] == null)
return RedirectToAction ("StartPage", "Home");
return View ();
}
}
美好而简单。 :)
答案 1 :(得分:0)
解决问题的一种方法是将guid或类似类型的“随机”数据附加到用户会话,并在请求页面时检查有效会话。如果没有,您将重定向到一个页面,说明此网址目前不可用,并且很快将重定向用户(然后使用js在5秒左右后重定向到主页)。
大致它会像这样工作:
当用户注册时,会创建一个会话cookie,例如GUID
。 GUID
也存储在数据库表中,其中UserID
主键有一列,GUID
有一列。您还可以创建身份验证cookie,从而将用户登录到您的站点。
完成所有数据广播等操作后,用户已成功注册,依此类推,您将重定向到确认页面。
加载确认页面后,用户将自动登录(因为您在步骤1中创建了身份验证Cookie)。然后,您可以在UserID-GUID表中检查与登录用户对应的行。
a)如果有这样的行,则删除该行,并显示包含所有信息的确认页面。
b)如果没有这样的行,则显示错误消息并重定向。当您第一次显示该消息时删除了该行,用户将无法再次访问确认页面。
注意:如果您使用此方法(或其他使确认页面仅可用一次的方法),您应确保在确认页面上明确说明用户将无法再次访问该页面。
答案 2 :(得分:0)
if(Request.UrlReferrer == null)
{
return RedirectToAction("Index");
}