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

Forms Clojure(Hiccup):我如何知道表单中按下了哪个提交按钮?,forms,clojure,hiccup,Forms,Clojure,Hiccup,我有一个表单,使用hiccup框架。看起来是这样的: (form-to {:enctype "multipart/form-data"} [:post "/add-data"] ... (submit-button {:class "btn"} "Save") (submit-button {:class "btn} "Clone")) {:http-method :post :uri "/add-data" :form-params {"button" "save"

我有一个表单,使用hiccup框架。看起来是这样的:

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

  ...

  (submit-button {:class "btn"} "Save")
  (submit-button {:class "btn} "Clone"))
{: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
               ...
               }
 ...}
在不使用jQuery/javascript的情况下,我如何知道按下了哪个提交按钮


我查看了Hiccup的文档以了解
请求
。但是,
请求
元素没有太多文档。

提交按钮
生成HTML
元素。您可以向其添加“名称”和“值”属性:

(submit-button {:name "button" :value "save" :class "btn"} "Save")
(submit-button {:name "button" :value "clone" :class "btn"} "Clone")
并在服务器端代码中找到它。在您的情况下,使用黑色lib。但最新版本的libnoir不再提供用于解构请求的util,并鼓励人们使用其他库,如Compojure或bare-Ring

基本上你需要: -确保您的服务器端应用程序使用
wrap-params
Ring中间件 -如果单击上面的“保存”按钮,则
[:post”/add data“]
的服务器端处理程序应接收如下哈希映射:

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

  ...

  (submit-button {:class "btn"} "Save")
  (submit-button {:class "btn} "Clone"))
{: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
               ...
               }
 ...}
我希望你能想出如何在这样一张地图上找到你需要的价值

更深入的阅读:


完整的示例如下所示:

(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
填写表格后,邮递路线的结果为:

 {"submit" "Save", "Hello" "hello2"}

顺便说一句,我发现了一篇关于Compojure中的方式的有用的文章,这样可以更容易地在Clojure代码中对其进行分解

但是,我怎样才能知道哪个按钮是从服务器端点击的呢?我正在使用lib-noir,但不知道如何使用它的请求来获取信息。库/框架的服务器端代码各不相同,因此最好在问题中提到lib-noir谢谢!这就是我要找的。