我还是ASP MVC 4的新手,我需要一些帮助来设计一个带有确认页面的基本注册方案的控制器。
我有一个表单,用户输入一些个人信息,并使用验证属性进行一些模型验证。在提交此表单时,我需要调用我的数据层进行更复杂的验证,然后重定向到显示给用户输入的确认,以便他可以验证所有内容。因此,只有在提交此确认表时才会在数据库中发生创建操作。
我读到PRG模式(Post-redirect-Get),我有点困惑,因为我不希望任何个人数据出现在注册和确认表格之间的URL中。
我希望我能够清楚地解释我的情况。
这是一个非常基本的场景,我们几乎无处不在,所以我希望在某个地方找到exmaples,但我找不到任何关于它的文章或教程。
提前致谢!
答案 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中。它基本上是一个会话变量,只能持续到下一个请求。但是,这意味着如果在页面刷新时数据丢失。