2017-02-14 27 views
8

当“创建或更新”形式的行为我有一个网站上的以下工作流程:击中背部按钮

  1. 一些用户李四声明了一个公司通过表格1 (字段:姓名,总店所在地)
  2. 在John Doe提交(HTTP POST)表单1后,他被重定向(HTTP 302)到公司表单2,并附加了有关公司的法律信息。

问题是,如果李四第2步中击中他的浏览器的后退按钮,他将登陆表单1上,通过浏览器填充数据(使用他已提交的值 - 这就是Firefox和重大浏览器似乎这样做)。

John Doe可能会认为他可以使用这种形式来更新一些信息(例如修复公司名义上的错字),而他实际上会创建一个新公司,因为我们不知道在服务器上他是否想要宣布新公司或更新他刚刚创建的公司。

你知道任何简单的解决方案来处理这个问题吗?

+0

是否从服务器端填充输入值? php示例:''”'' 可能的重复:http://stackoverflow.com/questions/2699284/make-page-to-tell-browser- not-cache-preserve-input-values –

+0

是否提交表单2的附加法律信息可选或必填? – user6003859

+0

@ManuelAzar:你提到的问题是如何不在输入中显示缓存的值,这是一种方法,但我正在寻找一个更聪明的“技巧”,让表单更新公司,如果我们可以知道用户只是回到填写了以前的数据的创建表格。 – Weier

回答

1

我认为这是更加人性化,当用户返回到前面的表格,并对其进行更新(而不是防止描述的行为),单独的密钥(隐藏字段) 。 我在大多数情况下,使用类似的方法来处理上述问题:

  1. 假设该用户的页面/some-page,包含“创建新公司”按钮。 当用户打开此页面时,将在服务器端执行特殊方法createOrFindCompanyDraft()。此方法在数据库中创建新的公司“草稿”记录(仅限当前用户)。例如,草稿记录具有主键id=473。当您再次执行此方法时,它将返回与id=473(具有“草稿”状态)相同的记录。 “草稿”记录不应该显示在任何其他接口上。 和“创建新公司”链接/company/common/473

  2. 当用户转到/company/common/473时,显示表格1,该表格将从“草稿”记录中填充。第一次用户会看到空的表单。 技术上,用户将更新现有记录,但您可以在页面上显示“创建新公司”标题。

  3. 然后用户转到表单2,例如/company/legal-info/473,为此表单创建类似的草稿记录(类似于步骤1)。

  4. 当用户提交表格2时,您将从记录id=473(及任何相关记录)中删除“草稿”状态。

  5. 下一次当用户打开页面/some-page时,会为当前用户创建新的草稿记录。

浏览器历史记录将包含:

  • /some-page
  • /company/common/473
  • /company/legal-info/473
  • /some-page2

我喜欢这种方法,因为所有的m只更新记录。您可以多次前往/下一个表格(例如“返回”/“前进”浏览器按钮)。您可以关闭浏览器,明天打开未完成的表单。这种方式不需要对浏览器历史进行任何额外的操作。

+0

我不明白你的答案的第一段如何与问题相关(部分endind是“show我请你如何使用这个缓存“)。但是,您的答案的其余部分提供了一个可能的解决方案:在提交表单1之前创建公司条目(及其标识)并在URL中使用它。我只是认为有一个通用简单的解决方案,但除此之外,我可以使用该或某种变体。 – Weier

+0

@Weier哦,对不起。我复制粘贴其他答案的一部分。我删除它。 – IStranger

3

在页面加载后使用javascript/jquery脚本清空所有输入。这将防止“更新公司”的混淆。

jQuery的会是这个样子:

$('#elementID').val(''); 
0

其实我想到了一个绝招,以获得行为“上的第一篇文章,更新后创建”(就像用户认为它应该表现)。

比方说,步骤1表格位于URL /create_company/。然后,我可以让该页面生成一个随机代码XXX并重定向到/create_company/?token=XXX。当我创建公司时,我保存通过带有标记XXX的页面创建的信息(例如,我将它保存在用户会话中,因为我们不需要永久保存该信息),并且在提交表单时,如果我知道一个公司已经使用这个令牌生成了,我知道用户使用了相同的表单实例,并且必须使用后退按钮,因为如果他明确要求另一个公司,令牌会有所不同。

您认为如何? (我最初认为应该有一个更简单的解决方案,因为这对于这样一个简单的问题似乎有些过度设计)

+0

什么框架或语言是你在用吗? @Weier –

+0

@ManuelAzar Django – Weier

+0

你可以请你的控制器,视图和表单对象?所以我可以帮助你根据你得到的。这是一个有效的,但马虎的方法。 @Weier –

0

这更像是一个用户体验问题。

我认为解决方案在于给用户提供的信息,以帮助他们理解他们在做什么。

例如,设置一个名称为“创建公司”的标题,并将您的提交按钮设置为“创建公司”,这将有助于您的用户。创建公司对象时使用唯一的ID,并将ID传递回相同的URL以执行更新。然后你应该更新你的标题和按钮,告诉用户他们正在更新而不是创建。

从这个意义上说,我认为最好使用更通用的URL,如/company/company?id=12345

您也可以考虑使用Restful API协议来帮助您的服务器识别CRUD操作。http://www.restapitutorial.com/lessons/httpmethods.html

1

也可以通过在形式2的负载manipulating the browser history 处理的情况,并通过生成的CompanyId上形式1的使用查询字符串提交。因此,您可以实际更新公司作为用户

假设John提交form1.html,生成一个唯一的CompanyId“1001”并将其重定向到form2.html。现在,在窗口2的负载,可以使用

var stateObj = { foo: "bar" }; 
history.pushState(stateObj, "page 1", "form1.html?companyid=1001"); 

现在,当用户单击后退按钮,并再次提交form1的修改浏览器历史记录form1.html?companyid = 1001。你可以在querystring中检查companyid并更新公司。

+0

TBH我不知道我们可以操纵历史......但这肯定会提供一个干净的解决方案。所有浏览器都允许透明吗? (我在真皮休闲想他们不允许添加与另一个域的入口......) – Weier

+0

是的,它是最常用的浏览器支持\t铬\t边缘\t火狐(壁虎)\t的Internet Explorer \t歌剧\t Safari浏览器 –

+1

请检查[浏览器兼容性](https://developer.mozilla.org/en-US/docs/Web/API/History_API) –

0

没有django的“路由”部分,它很难提供帮助。我可以从express.js路由器功能回答我的经验:

  • 您可以指定一个帖子在/ company,这是为新用户。
  • 您可以指定另一条路线在/ company /:companyid上发布更改表单
  • 并且作为创建回复,您可以重定向到不同的位置。
0

试试这个

<form autocomplete="off" ...></form> 

而另一个

使用临时表或会话存储1表单数据。如果页面2表单被提交,则使用存储在数据库或会话中的页面1的临时数据。

使用页面或1和第2页。