3
无法找到解决方案的一个简单问题,答案应该是显而易见的。如何使用哈姆雷特模板内的查询参数呈现网址?使用查询参数渲染url
即@{ItemsR}
将生成http://localhost:3000/items
,我如何生成类似http://localhost:3000/items?page=10&sort=name
的东西?
无法找到解决方案的一个简单问题,答案应该是显而易见的。如何使用哈姆雷特模板内的查询参数呈现网址?使用查询参数渲染url
即@{ItemsR}
将生成http://localhost:3000/items
,我如何生成类似http://localhost:3000/items?page=10&sort=name
的东西?
Yesod是REST风格的,如果您希望使用QueryString
格式,则应该使用url格式的参数(例如/items/page/10/sortby/name
),那么您将丢失Yesod类型的安全url管理。
下面的例子演示了如何使用不同的REST风格的表示和重定向(渲染查询字符串URL)来请求读取参数从查询字符串
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE MultiParamTypeClasses #-}
import Yesod
import Data.Text
import Network.Wai.Handler.Warp (run)
data RouteTest = RouteTest
mkYesod "RouteTest" [parseRoutes|
/item/all/page/#Int/sortby/#Text Items1R GET
/items/page/#Int/sortby/#Text Items2R GET
/items/#Int/#Text Items3R GET
/itemsquery ItemsQueryR GET
|]
instance Yesod RouteTest where
defaultLayout widget = do
pc <- widgetToPageContent widget
hamletToRepHtml [hamlet|\<!DOCTYPE html><html lang="en"><body>^{pageBody pc}</body></html>|]
getItemsR :: Text -> Int -> Text -> HandlerT RouteTest IO Html
getItemsR path page sortby =
defaultLayout [whamlet|
<h1>Items Page ##{page} sorted by #{sortby}
<h4>(Using #{path} path format)
<p>Same request in query string format
<a href="@{ItemsQueryR}?page=#{page}&sort=#{sortby}">
here
|]
getItems1R = getItemsR $ pack "large"
getItems2R = getItemsR $ pack "medium"
getItems3R = getItemsR $ pack "short"
getItemsQueryR = do
req <- getRequest
defaultLayout [whamlet|
<h1>Query String arguments format
<ul>
$forall (k, v) <- reqGetParams req
<li>
<b>#{k}</b>: #{v}
|]
main = run 8181 =<< toWaiApp RouteTest
当然
,你可以写一个辅助采取一些喜欢你的@{ItemsR page sortby}
renderItemsQueryR page sortby = hamletToRepHtml [hamlet|@{ItemsQueryR}?page=#{page}&sort=#{sortby}|]
,但你必须为
...
url <- renderItemsQueryR page sortby
defaultLayout [whamlet|
...
<a href=#{url}>
...
|]
使用
最后,你可以写其他助手来解析任何查询字符串的URL
renderQueryString path keyValues = do
let querystring = intercalate "&" $ map (\(k, v) -> concat [k, "=", v]) keyValues
hamletToRepHtml [hamlet|@{path}?#{querystring}|]
届时,renderItemsQueryR
可以写成
renderItemsQueryR page sortby = renderQueryString ItemsQueryR [("page" , show page)
,("sortby", sortby )]
'ItemsR'应该有一些指定参数时,尝试'@ {ItemsR 10“名称“} – josejuan
如果我理解正确,处理程序参数来自路径段。 – lambdas
是的,如果你希望“传统的参数”,你可以直接在你的模板上呈现你的网址(例如' josejuan