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

时间:2009-04-15 20:59:33

标签: asp.net-mvc

我目前正在处理项目中的用户注册。注册完成后,我希望向用户显示一些确认。我决定创建另一个视图。没关系。

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

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

        return View ("ConfirmationView");
    }
}

一切都按预期工作。标题栏中没有更改的网址。但是......如果我点击刷新按钮,浏览器将再次从表单中提交我不想要的数据。

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

有什么方法可以实现这个目标吗?

3 个答案:

答案 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秒左右后重定向到主页)。

大致它会像这样工作:

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

  2. 完成所有数据广播等操作后,用户已成功注册,依此类推,您将重定向到确认页面。

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

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

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


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

答案 2 :(得分:0)

if(Request.UrlReferrer == null)
{
    return RedirectToAction("Index");
}