4

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

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

  ...

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

在不使用 jQuery/javascript的情况下,我如何知道按下了哪个提交按钮?

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

4

2 回答 2

5

一个完整的示例如下所示:

(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 中的结构方式的有用的旧帖子,因此它可以更容易地在 Clojure 代码中对其进行解构。

于 2015-01-13T01:00:52.203 回答
2

submit-button生成 HTML<input type="text" ...>元素。您可以向它们添加“名称”和“值”属性:

(submit-button {:name "button" :value "save" :class "btn"} "Save")
(submit-button {:name "button" :value "clone" :class "btn"} "Clone")

并在您的服务器端代码中找到它。在您的情况下,使用 lib-noir。但最近版本的 lib-noir 不再提供用于解构请求的实用程序,并鼓励人们使用其他库,如 Compojure 或裸环。

基本上你需要: - 确保你的服务器端应用程序使用wrap-paramsRing 中间件 - 如果点击上面的“保存”按钮,你的服务器端处理程序[: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

于 2015-01-12T04:58:40.457 回答