在ASP MVC中,我应该如何使用确认页面构建我的控制器以进行注册过程

时间:2014-01-09 16:49:47

标签: asp.net-mvc asp.net-mvc-4 registration

我还是ASP MVC 4的新手,我需要一些帮助来设计一个带有确认页面的基本注册方案的控制器。

我有一个表单,用户输入一些个人信息,并使用验证属性进行一些模型验证。在提交此表单时,我需要调用我的数据层进行更复杂的验证,然后重定向到显示给用户输入的确认,以便他可以验证所有内容。因此,只有在提交此确认表时才会在数据库中发生创建操作。

我读到PRG模式(Post-redirect-Get),我有点困惑,因为我不希望任何个人数据出现在注册和确认表格之间的URL中。

我希望我能够清楚地解释我的情况。

这是一个非常基本的场景,我们几乎无处不在,所以我希望在某个地方找到exmaples,但我找不到任何关于它的文章或教程。

提前致谢!

4 个答案:

答案 0 :(得分:2)

您可以使用此模式。虽然名称是Post Get Redirect,但用户第一次在登录页面上进行GET操作,只需在浏览器中输入即可。服务器将发送一个空表单作为答案。一旦用户在他的浏览器上显示该表单,您就处于PRG的POST步骤:

  • POST:用户填写表单并提交表单(当客户端验证成功时)。当服务器获取数据时,它可以进行服务器端验证。如果服务器端验证失败,则服务器将表单发送回用户,以便他可以再次尝试。服务器和用户将多次交换表单,直到服务器验证正常。

  • REDIRECT:服务器端验证完成后,服务器注册用户并向浏览器发送重定向(HTTP 301或302),其中包含浏览器必须加载的新URL。

  • GET:当浏览器从服务器收到重定向时,它会发出新URL的GET。

重定向网址通常会显示下一步或确认页面。在这种情况下,它可能是一个"注册成功"页。

PRG模式的优点是刷新浏览器(重新加载页面)不会产生不良副作用(比如在此示例中注册用户两次):

  • 如果用户在POST步骤中刷新浏览器,表单将被发送回服务器。但是用户只能在POST步骤中执行此操作(因此,仍未注册)

  • 用户注册后,浏览器已使用GET重定向到新页面。因此,如果用户刷新浏览器,他会重复GET,并且服务器端没有任何反应。

即,如果您正确实现此模式,服务器只会在POST请求上执行操作(如注册用户)。在GET请求中,应用程序应该只向用户显示数据,但不做任何更改。

顺便说一句,所有个人数据都将在第一步(POST)中发布到服务器。 REDIRECT和GET步骤中使用的URL没有任何个人信息URL。为此,一旦用户注册/验证,您通常会在会话中存储必要的个人数据。

答案 1 :(得分:1)

您可以在服务器验证后将用户数据存储在会话中。然后在用户的确认页面上显示所有内容。最后将所有内容存储在数据库中。

答案 2 :(得分:1)

我会构建如下所示的控制器类。我将使用会话来存储用户信息以将其发送到确认页面,但是你可以选择任何其他方式,如果可以从一个cookie安全观点

Public class RegistrationController:Controller
{
    [HttpGet]
    public FillInformation()
    {
        ...
        Return view();
    }

    [HttpPost]
    public FillInformation(UserInformation UserInformation)
    {
        if (ModelState.IsValid)
        {
            //do some further validation here and if succeed then save to session
            Session["info"] = UserInformation;
            return RedirectToAction("Confirmation");
        }

        Return view(UserInformation);
    }

    [HttpGet]
    public Confirmation()
    {
        // get object from session
        UserInformation info = Session["info"]
        Return view(info);
    }

    [HttpPost]
    public Confirmation()
    {
        // get object from session
        UserInformation info = Session["info"]
        //Save data to database here
    }
}

此外,由于您使用的是MVC 4,另一种方法是通过实施WEB API服务来使用服务调用。

答案 3 :(得分:0)

另一种可能性是将其存储在TempData中。它基本上是一个会话变量,只能持续到下一个请求。但是,这意味着如果在页面刷新时数据丢失。