微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何以IHP形式传递列表参数?

如何解决如何以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"而不是mapMaybemap丢弃所有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 举报,一经查实,本站将立刻删除。