Language agnostic 在执行POST提交重定向时,如何在POST后保留确认消息?

Language agnostic 在执行POST提交重定向时,如何在POST后保留确认消息?,language-agnostic,web-applications,Language Agnostic,Web Applications,你好, 我正在寻找有关如何在web应用程序中的单个请求之间共享某些数据位(即提交后确认消息)的建议。让我解释一下: 目前的做法: 用户提交资源的添加/编辑表单 如果没有错误,将向用户显示一条确认信息,其中包含以下链接: 提交新资源(用于“添加”表单) 查看提交/编辑的资源 查看所有资源(层次结构中的上一步) 然后,用户必须单击三个链接中的一个才能继续(即转到“上面”的页面) 在编程方面,表单及其确认页面是一组类。上面那一页是另一页。它们可以在技术上共享代码,但目前它们在处理单个请求时都是独立

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

目前的做法:

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

    我们想对上述内容进行如下修改:

  • 用户提交资源的添加/编辑表单
  • 如果没有错误,用户将被重定向到包含所有资源的页面(层次结构上的一个步骤),页面顶部显示一条或多条确认消息(即成功消息、请求分配给谁等)
  • 这将:

  • 只需单击一次即可保存用户(他们必须浏览大量此类添加/编辑表单)
  • 提交后重定向将解决浏览器刷新/返回按钮的常见问题
  • 对于在两个请求之间共享确认消息所需的数据,您建议采用什么方法?

    我不确定它是否有用,它是一个由RESTful API支持的PHP应用程序,但我认为这是一个语言不可知的问题

    想到的一些简单解决方案是通过cookie或在会话中共享数据,但这会打破无状态状态,并会给在多个选项卡中工作的用户带来严重问题(数据可能会冲突在一起)。将数据作为GET参数传递是不合适的,因为我们讨论的是几个动态消息(例如,更改参与者、日期)

    谢谢,

    M.

    听起来需要一种用户信息系统。我的意思是,过程可能类似于以下内容:

  • 用户提交表单
  • 系统可以为用户注册一组通知/消息(存储在DB表或类似的行中)
  • 系统将重定向响应发送给用户
  • 在为用户加载下一页时,系统将检查用户是否有任何挂起的消息
  • 如果确实如此,则将其从挂起列表/表中删除,并将其添加到页面中
  • 这可以避免出现页面状态问题,同时仍然向用户提供要显示的消息,请注意,您可能需要根据需要调整细节

    希望这有帮助。

    ASP.NET 由于这个问题是以语言不可知论的形式提出的,您可能会对ASP.NET感兴趣,它正是您想要实现的


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

    会话

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

    数据库

    将数据库中的数据按队列排列,但我认为这样查询每个请求不是一个好主意。如果应用程序稍大一些,DB服务器上会有很多请求,这可能会减慢速度

    卷曲

    如果有机会,请利用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不会改变,所以用户可能会感到困惑-我不会真的推荐它


    我个人认为您的案例可能是一个设计缺陷。为什么要将表单页面中的所有资源移到其他页面上?在为其设计的文件/类中处理数据,然后决定结果不是很容易吗?如果出现问题,它将返回表单页面上的用户,如果一切顺利,您将发布将数据发送到DB并显示概览页面,其中包含一些令人高兴的消息,表示一切正常


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

    我敢肯定之前已经以不同的形式回答了这个问题-检查这个问题,看看它是否对您有帮助-(或者,尝试在[Post Get Redirect]上搜索)tag,因为这个问题有很多问题。)@Jeff:你当然是对的。我不知道这个问题的正确术语是Post-Get-Redirect(PRG),很高兴知道。有很多很好的替代方法来处理它-谢谢你的指导,非常感谢!嗨,Ondrej,谢谢你的反馈。只是澄清一个可能的误解:我不想在不同的页面上处理数据-我希望它们被同一个页面/类处理,允许它们编辑数据。redirect将在之后发挥作用,以解决我问题末尾的两个数字项目。嗨,confusedGeek,谢谢你的建议。这实际上是我自己考虑的一个选项,但为了解决确认消息处理问题,使用DB存储似乎是一种过度使用。从处理点来看,使用$s锡安将更有效,因为在这种情况下,它只是一个临时存储-但这两种选择都必须处理额外的检查,以防止