使用查询参数呈现网址 [英] Render url with query parameters

查看:70
本文介绍了使用查询参数呈现网址的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

找不到简单问题的解决方案,答案应该很明显.如何在哈姆雷特模板中使用查询参数呈现网址?

Can't find solution to a simple problem, the answer should be obvious. How to render url with a query parameters inside hamlet template?

@{ItemsR}将生成http://localhost:3000/items,我该如何生成类似http://localhost:3000/items?page=10&sort=name的内容?

I.e. @{ItemsR} will generate http://localhost:3000/items and how do I generate something like http://localhost:3000/items?page=10&sort=name?

推荐答案

Yesod是RESTful的,如果希望使用QueryString格式,则应使用url格式的参数(例如/items/page/10/sortby/name),然后丢失Yesod类型安全的网址管理.

Yesod is RESTful, you should use arguments in url format (eg. /items/page/10/sortby/name) if you wish use QueryString format then, you loss the Yesod type safe url management.

下面的示例演示如何使用不同的RESTful表示形式和重定向(从查询字符串中读取参数)到请求的重定向(呈现查询字符串url)

Below example show how use different RESTful representation and a redirection (rendering a querystring url) to a request reading arguments from querystring

{-# 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}

of course, you can write a helper to take some like your @{ItemsR page sortby}

renderItemsQueryR page sortby = hamletToRepHtml [hamlet|@{ItemsQueryR}?page=#{page}&sort=#{sortby}|]

但您必须使用

...
url <- renderItemsQueryR page sortby
defaultLayout [whamlet|
    ...
    <a href=#{url}>
    ...
|]

最后,您可以编写其他助手来呈现任何查询字符串url

finally, you can write other helper to render any querystring 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   )]

这篇关于使用查询参数呈现网址的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆