代码之家  ›  专栏  ›  技术社区  ›  User

如何创建不能直接访问但只能重定向到的视图?

  •  1
  • User  · 技术社区  · 16 年前

    我目前正在我的项目中进行用户注册。注册完成后,我希望向用户显示一些确认信息。我决定创建另一个视图。那很好。

    现在,如果在注册之后,我只返回视图如下:

    public class MyController : Controller
    {
        [AcceptVerbs (HttpVerbs.Post), ValidateAntiForgeryToken]
        public ActionResult Registration (FormCollection form)
        {
            /* Some logic goes here */
    
            return View ("ConfirmationView");
        }
    }
    

    一切正常。标题栏中没有已更改的URL。但是…如果单击“刷新”按钮,浏览器将再次提交表单中我不需要的数据。

    然后我决定创建一个单独的操作,但这意味着它将在地址栏中生成一个新的URL。我不希望用户现在单击“刷新”,因为此视图将无法再次敏感地显示确认信息。是否有任何方法使操作不能直接访问?或者至少有任何方法来确定它是直接调用的还是通过重定向调用的?在后一种情况下,我只会将用户从该页面带到主页。

    有没有办法做到这一点?

    3 回复  |  直到 10 年前
        1
  •  3
  •   User    16 年前

    所以我自己找到了解决办法。

    可以使用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 ();
        }
    }
    

    又好又简单。:)

        2
  •  0
  •   Tomas Aschan    16 年前

    解决问题的一种方法是将guid或类似类型的“随机”数据附加到用户会话,并在请求页面时检查有效会话。如果没有,则重定向到一个页面,表明该URL当前不可用,并且用户很快将被重定向(然后在5秒左右使用JS重定向到主页)。

    大致来说,它的工作原理如下:

    1. 注册用户时,会创建会话cookie,例如 GUID . 这个 GUID 也存储在数据库表中,其中有一列用于 UserID 主键和一个用于 GUID . 您还创建了一个身份验证cookie,从而将用户登录到您的站点。

    2. 完成所有数据调用等后,用户已成功注册等,您将重定向到确认页。

    3. 加载确认页时,用户将自动登录(因为您在步骤1中创建了身份验证cookie)。然后,可以检查与登录用户对应的userid guid表中的行。

      a)如果存在这样的行,则删除该行,并显示包含所有信息的确认页。

      b)如果没有该行,则显示错误消息并重定向。当您第一次显示消息时删除了该行,用户将无法再次访问确认页。


    注意:如果您使用这种方法(或其他使确认页只可用一次的方法),您应该确保在确认页上明确说明用户将无法再次访问该页。

        3
  •  0
  •   Rohan Kumar    10 年前
    if(Request.UrlReferrer == null)
    {
        return RedirectToAction("Index");
    }