如何解决如何以IHP形式传递列表参数?
我正在尝试在IHP中将多选部分纳入我的表格。目前正在尝试通过视图中的多个复选框来解决该问题。
renderIngredientSelection :: Ingredient -> Html
renderIngredientSelection ingredient = [hsx|
<li>
<input name="ingredients" type="checkBox" value={(get #name ingredient)} />{get #name ingredient}
</li>
|]
因此,网络日志的浏览器工具表示它正在正确发送这样的请求。
barcode=5555555555555&name=Pancake&ingredients=milk&ingredients=egg
但是在控制器中,param
函数将仅捕获第一个ingredients
参数。
有什么方法可以在控制器中捕获所有这些参数?我在网络日志中看到,创建了一个包含所有参数(包括两个ingredients
参数)的元组列表。我如何访问它并将其映射到["milk","egg"]
之类的列表中?
解决方法
您可以使用allParams
访问在日志中看到的完整请求参数。
对于类似这样的请求
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#","contentVersion": "1.0.0.0","parameters": {
"vnetName": {
"type": "string","defaultValue": "VNet1","metadata": {
"description": "VNet name"
}
},"vnetAddressPrefix": {
"type": "string","defaultValue": "10.0.0.0/16","metadata": {
"description": "Address prefix"
}
},"subnet1Prefix": {
"type": "string","defaultValue": "10.0.0.0/24","metadata": {
"description": "Subnet 1 Prefix"
}
},"subnet1Name": {
"type": "string","defaultValue": "Subnet1","metadata": {
"description": "Subnet 1 Name"
}
},"subnet2Prefix": {
"type": "string","defaultValue": "10.0.1.0/24","metadata": {
"description": "Subnet 2 Prefix"
}
},"subnet2Name": {
"type": "string","defaultValue": "Subnet2","metadata": {
"description": "Subnet 2 Name"
}
},"location": {
"type": "string","defaultValue": "[resourceGroup().location]","metadata": {
"description": "Location for all resources."
}
}
},"variables": {},"resources": [
{
"type": "Microsoft.Network/virtualNetworks","apiVersion": "2020-05-01","name": "[parameters('vnetName')]","location": "[parameters('location')]","properties": {
"addressSpace": {
"addressPrefixes": [
"[parameters('vnetAddressPrefix')]"
]
}
},"resources": [
{
"type": "subnets","name": "[parameters('subnet1Name')]","dependsOn": [
"[parameters('vnetName')]"
],"properties": {
"addressPrefix": "[parameters('subnet1Prefix')]"
}
},{
"type": "subnets","name": "[parameters('subnet2Name')]","dependsOn": [
"[parameters('vnetName')]","[parameters('subnet1Name')]"
],"properties": {
"addressPrefix": "[parameters('subnet2Prefix')]"
}
}
]
}
]
}
我们可以像这样使用barcode=5555555555555&name=Pancake&ingredients=milk&ingredients=egg
:
allParams
我们仍然需要过滤此列表以仅返回成分值:
action MyAction = do
let ingredients = allParams
-- ingredients = [("barcode",Just "5555555555555"),("name",Just "Pancake"),("ingredients",Just "milk"),Just "egg")]
现在,我们需要将此键值映射仅映射到值。由于该值是一个可能值(例如action MyAction = do
let ingredients = allParams
|> filter (\(paramName,paramValue) -> paramName == "ingredients")
-- ingredients = [("ingredients",Just "egg")]
),因此我们将使用Just "milk"
而不是mapMaybe
。 map
丢弃所有mapMaybe
的值并解包Nothing
:
Just
我们现在有一个action MyAction = do
let ingredients = allParams
|> filter (\(paramName,paramValue) -> paramName == "ingredients")
|> mapMaybe (\(paramName,paramValue) -> paramValue)
-- ingredients = ["milk","ingredients"]
。我们正在处理的大多数函数期望使用[ByteString]
而不是Text
,因此让我们使用ByteString
(cs是转换字符串的缩写)进行转换:
cs
将其移至action MyAction = do
let ingredients :: [Text] = allParams
|> filter (\(paramName,paramValue) -> paramValue)
|> map cs
-- ingredients = ["milk","ingredients"]
对于一个不错的代码结构,我将把这个函数移到Application/Controller/Helper.hs
上,像这样:
Application/Controller/Helper.hs
然后像这样在控制器中使用它:
module Application.Helper.Controller
( ...,paramList -- Don't forget the export :)
)
paramList name = allParams
|> filter (\(paramName,paramValue) -> paramName == name)
|> mapMaybe (\(paramName,paramValue) -> paramValue)
|> map cs
action MyAction = do
let ingredients = paramList "ingredients"
中的所有功能在我们的控制器中自动可用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。