我试图在一个页面上构建一个包含多个相似表单的页面。每个表单都非常简单,它提供了一个整数输入和一个提交按钮。每个表单对应一个计数器,并且在提交表单时应该增加计数器。
incrementCounterForm :: Entity Counter -> Form (CounterId, Int)
incrementCounterForm (Entity i _) = renderBoostrap3 BootstrapInlineForm
$ (,)
<$> pure i
<*> areq intField "value" Nothing
在我的GET处理程序中,我做
counters <- runDB $ selectList [] [] -- Get all the current counters
forms <- mapM (generateFormPost . incrementCounterForm) counters -- Generate the forms
然后在我的hamlet文件中,我遍历表单并单独渲染它们(它们都转到同一个处理程序)。
我的问题与POST处理程序有关。我该怎么做runFormPost?
((result,_),_) <- runFormPost $ incrementCounterForm undefined
undefined
应该在这里?我想从表格中获取计数器,而不是提供一个。
如果我提供任意 Entity Counter
它似乎有用(结果中没有使用提供的计数器)。但是,我不能将其保留为undefined
,因为runFormPost似乎在评估它。
答案 0 :(得分:0)
所以,我可能会建议您将您的计数器ID移到URL中,这样您就可以执行POST / to / / / / increment等操作。稍微感觉到ID在隐藏的字段中。
但是,如果您确实希望将其保留在隐藏字段中,则可以让表单以Maybe (Entity Counter)
作为参数。您要做的是当用户获取页面并且您正在生成表单时,您将传递(Just entity)
作为您将用于填充表单的参数隐藏的领域。当用户向您发送POST并运行表单时,您将不提供默认值(因为您需要存储在隐藏字段中的值)。
以下是一个示例:
data MyForm = MyForm
{ increment :: Integer
, counterId :: CounterId
}
deriving Show
myForm :: Maybe (Entity Counter) -> AForm Handler MyForm
myForm maybeEntity = MyForm
<$> areq intField "How much to increment?" Nothing
<*> areq hiddenField "" (entityKey <$> maybeEntity)
生成表单时,请为隐藏字段提供值:
(widget, enctype) <- generateFormPost $ renderBootstrap (myForm (Just someEntity))
运行表单时,请勿提供默认值;隐藏字段应该已经有数据:
((res, widget), enctype) <- runFormPost $ renderBootstrap (myForm Nothing)