我有一个表格,使用打嗝框架。它看起来像这样:
(form-to {:enctype "multipart/form-data"}
[:post "/add-data"]
...
(submit-button {:class "btn"} "Save")
(submit-button {:class "btn} "Clone"))
如何知道哪个提交按钮被按下,没有使用jQuery / javascript?
我查看了request
的Hiccup文档。但是,request
元素没有很多文档。
答案 0 :(得分:4)
完整示例如下:
(ns myapp.routes.home
(:use [hiccup core form])
(:require [compojure.core :refer :all]))
(defn quick-form [& [name message error]]
(html
(form-to {:enctype "multipart/form-data"}
[:post "/form-out"]
(text-field "Hello")
(submit-button {:class "btn" :name "submit"} "Save")
(submit-button {:class "btn" :name "submit"} "Clone"))))
请注意,对两个提交按钮使用相同的名称,您可以简单地查找"提交"键结果映射。
(defroutes home-routes
(GET "/form-in" [] (quick-form))
(POST "/form-out" [:as request] (str (request :multipart-params))))
打开以下页面时:
http://localhost:3000/form-in
填写表格后,POST路线的结果是:
{"submit" "Save", "Hello" "hello2"}
顺便说一句,我找到了一篇关于Compojure中request map is structured方式的旧帖子,因此它更容易在Clojure代码中对其进行解构。
答案 1 :(得分:2)
submit-button
生成HTML <input type="text" ...>
元素。你可以添加&#34; name&#34;和&#34;价值&#34;他们的属性:
(submit-button {:name "button" :value "save" :class "btn"} "Save")
(submit-button {:name "button" :value "clone" :class "btn"} "Clone")
并在服务器端代码中找到它。在你的情况下使用lib-noir。但最近版本的lib-noir不再提供用于解构请求的工具,并鼓励人们使用其他库,如Compojure或裸环。
基本上你需要:
- 确保您的服务器端应用程序使用wrap-params
Ring中间件
- 如果以上情况&#34;保存&#34;单击按钮,[:post "/add-data"]
的服务器端处理程序应该收到如下的哈希映射:
{:http-method :post
:uri "/add-data"
:form-params {"button" "save"
;; other form data as key/value pairs
;; where: key is input element's "name" attribute and value is input element's "value" attribute
...
}
...}
我希望你能弄清楚如何在这样的地图中找到你需要的价值。
更深入的阅读: