使用yesod-form在POST/Redirect/GET后保持不正确的用户输入

Jak*_*kub 8 forms haskell post-redirect-get yesod

最近我偶然发现了以下问题:
使用yesod我想要的

  1. 显示一个应用表单,让用户将他的数据发送给一个特殊的处理程序
  2. FormFailure 重定向浏览器到前一页
  3. 打印错误消息...
  4. ...并重新显示已填充不正确的用户提供的数据的表单

就我而言,这POST/Redirect/GET就是全部.

虽然<1-3>点需要简单直接的实现,但我发现无法实现点<4>!
所述耶索德形式包自动处理此问题,但不允许形式之间的任何重定向解析<2>和错误处理<3,4>如我想的那样.

回应Michael Snoyman的回答

您建议我应该序列化提交的数据,并在重定向后以某种方式将其注入表单.这会导致更详细的问题:

  1. 如何获取序列化数据?

    我知道我可以使用,但哪些是相关信息(字段的s是自动生成的)?runRequestBody:: GHandler s m RequestBodyContentsname

  2. 如何将数据注入表单?

    如果你看一下例如aopt的类型

    aopt :: Field sub master a -> FieldSettings master -> Maybe (Maybe a) -> AForm sub master (Maybe a)
    
    Run Code Online (Sandbox Code Playgroud)

    你会发现它要求默认值与Field它的类型相同,因此无法重新插入可能无法正确解析的用户提供的数据.

    示例:用户在"a"中键入"A" intField.现在我希望能够在重定向后在同一个字段中显示"A",但API不允许我这样做.

我该如何处理这个问题?

Mic*_*man 2

我个人认为用 POST 请求返回一个填写好的表单是可以接受的,这就是 yesod-form API 的优化目的。如果您还想在表单提交失败时强制重定向,则需要序列化提交的数据并将其存储在某处,例如:

  1. 在数据库中。
  2. 在用户会话中。
  3. 作为您重定向到的 URL 的查询字符串参数的一部分。请注意,此方法不适合敏感数据,因为任何中间代理都会缓存表单数据。