Clojure(Hiccup):我如何知道在表单中按下哪个提交按钮?

时间:2015-01-11 20:15:06

标签: forms clojure hiccup

我有一个表格,使用打嗝框架。它看起来像这样:

(form-to {:enctype "multipart/form-data"}
  [:post "/add-data"]

  ...

  (submit-button {:class "btn"} "Save")
  (submit-button {:class "btn} "Clone"))

如何知道哪个提交按钮被按下,没有使用jQuery / javascript?

我查看了request的Hiccup文档。但是,request元素没有很多文档。

2 个答案:

答案 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
               ...
               }
 ...}

我希望你能弄清楚如何在这样的地图中找到你需要的价值。

更深入的阅读:

https://github.com/mmcgrana/ring/wiki/Parameters