An old question, but I need it today, so maybe post it to others facing the same problem.
Basically, as Michael suggests, we can serialize data per session. This is difficult to do, plus getting it into shape is even more difficult. I had to rip postEnv and postHelper from Yesod.Form.Functions , since they are not exported, but are necessary for this.
You can then use setLastInvalidPost in your handler before the redirect, and then use generateFormFromLastPost in the target handler.
Note that it would be better to use something like Data.Serialize for serialization; however, the Show / Read instances were good enough for my needs (and much simpler).
Here is some good stuff. If you want a complete working snippet, you can test your meaning .
-- Create a form from last post data in the session if exists, otherwise create a blank form. generateFormFromLastPost :: (RenderMessage (HandlerSite m) FormMessage, MonadHandler m) => (Markup -> MForm m (FormResult a, xml)) -> m (xml, Enctype) generateFormFromLastPost form = do env <- getLastInvalidPost case env of Nothing -> generateFormPost form Just _ -> first snd <$> postHelper form env lastInvalidPostSessionKey :: Text lastInvalidPostSessionKey = "lastInvalidPost" -- Sets the post data retreived from postEnv, ignoring the FileEnv. setLastInvalidPost :: MonadHandler m => Maybe (Env, FileEnv) -> m () setLastInvalidPost Nothing = return () setLastInvalidPost (Just (env, _)) = sessionSetter lastInvalidPostSessionKey env -- Retrieves the previous post data to be passed to postHelper. getLastInvalidPost :: MonadHandler m => m (Maybe (Env, FileEnv)) getLastInvalidPost = do result <- sessionGetter lastInvalidPostSessionKey return $ case result of Nothing -> Nothing Just env -> Just (env, Map.fromList []) sessionSetter :: (MonadHandler m, Show a) => Text -> a -> m () sessionSetter key = setSession key . pack . show sessionGetter :: (MonadHandler m, Read b) => Text -> m (Maybe b) sessionGetter key = do m <- lookupSession key return $ readMaybe . unpack =<< m
pyrospade
source share