如何在POST后提交确认消息,同时进行提交后重定向?

时间:2010-03-20 23:03:40

标签: language-agnostic web-applications

您好
我正在寻找关于如何在Web应用程序中的各个请求之间共享某些数据位(即提交后确认消息)的建议。让我解释一下:

目前的做法:

  1. 用户提交资源的添加/编辑表单
  2. 如果没有错误,将向用户显示包含以下链接的确认:
    • 提交新资源(“添加”表单)
    • 查看已提交/已编辑的资源
    • 查看所有资源(层次结构中的上一步)
  3. 用户必须点击三个链接中的一个才能继续(即到“上面”页面)
  4. 从形式上讲,表单及其确认页面是一组类。上面的页面是另一个。它们可以在技术上共享代码,但目前它们在处理单个请求时都是独立的。

    我们想修改以上内容:

    1. 用户提交资源的添加/编辑表单
    2. 如果没有错误,则用户重定向到具有所有资源的页面(层次结构中的上一步),并在页面顶部显示一条或多条确认消息(即成功消息) ,请求分配给谁,等等)
    3. 这将:

      1. 保存用户一次点击(他们必须经历很多这些添加/编辑表单)
      2. 提交后重定向将解决浏览器刷新/后退按钮的常见问题
      3. 您建议使用哪种方法来共享两个请求之间的确认消息所需的数据?

        我不确定它是否有帮助,它是一个由RESTful API支持的PHP应用程序,但我认为这是一个与语言无关的问题。

        一些简单的解决方案是通过cookie或会话共享数据,但这会打破无状态,并且会对在多个选项卡中工作的用户造成严重问题(数据可能会发生冲突)。将数据作为GET参数传递是不合适的,因为我们正在谈论几个动态的消息(例如,更改演员,日期)。

        谢谢,
        微米。

2 个答案:

答案 0 :(得分:2)

听起来需要用户消息系统的类型。我的意思是这个过程看起来类似于以下内容:

  1. 用户提交表单
  2. 系统可以为用户注册一组通知/消息(存储在数据库表中或沿着这些行显示。
  3. 系统将重定向响应发送给用户
  4. 在下一页加载用户时,系统会检查用户是否有任何待处理的消息。
  5. 如果他们这样做,然后将其从待处理列表/表中删除并将其添加到页面
  6. 这样可以避免出现页面状态问题,同时仍然向用户提供要显示的消息,请注意您可能需要根据需要调整细节。

    希望这有帮助。

答案 1 :(得分:1)

ASP.NET

由于问题是以语言无关的方式呈现的,因此您可能对ASP.NET Server.Transfer感兴趣,而confusedGeek described in his post完全符合您的要求。


PHP

然而对于PHP来说,情况似乎并不容易,而且我想到的所有解决方案都有设计气味:

<强>会话

使用会话使用特定标志标记数据,然后在概述页面上检查并使用它们。您不必确定在不再需要这些数据后总是取消设置这些数据,这可能很棘手。

<强>数据库

将这些数据作为{{3}}排入数据库,但我认为查询这样的每个请求都不是一个好主意。如果你的应用程序有点大,那么在数据库服务器上会有很多请求,这可能会减慢速度。

<强>卷曲

如果有机会,可以利用PHP中的cURL:

<?php
$curl = curl_init( );

curl_setopt( $curl, CURLOPT_URL, "http://localhost/something.php" );
curl_setopt( $curl, CURLOPT_POST, true );
curl_setopt( $curl, CURLOPT_POSTFIELDS, $_POST );

curl_exec( $curl );
curl_close( $curl );
?>

<form action="test.php" method="post">
    <input id="textfield" name="textfield" />
    <input type="submit" />
</form>

这段代码在服务器端获取something.php,允许向其发送POST数据并向您显示其内容(在此示例中可能只是print_r( $POST );)。这个可以做你需要的,但它又有一个缺陷 - URL不会改变,所以用户可能会感到困惑 - 我不会真的推荐它。


我个人认为你的案子可能是一个设计缺陷。为什么要从表单页面获取所有资源并将其移动到其他页面?在为其设计的文件/类中使用您的数据并不容易,然后只决定您有什么结果?如果某些内容失败,它会在页面上返回带有表单的用户,如果一切顺利,您将数据发布到数据库并显示概述页面,其中包含一些快乐的消息,表明一切正常。

如果您真的想继续将所有内容发送到其他页面,那么使用AJAX / AJAJ可能是您的另一种解决方案。