【问题标题】:How to put link in submit-button, using Clojure如何使用 Clojure 将链接放入提交按钮
【发布时间】:2014-08-29 19:15:20
【问题描述】:

我从事 Clojure 项目已有一段时间了,想知道如何在单击提交按钮后将用户从一个页面导航到另一个页面。 代码如下:

(defn view-film-input [] 
 (view-layout 
   [:body {:style "background-color: #F2FB78"}
   [:h2 "Add new film"] 
   (form-to [:post "/addfilm" ]

  (label "movname" "Film title: ")
  (text-field  :txtname) [:br] 

  (label "prname" "Producer name: ")
  (text-field  :txtprname) [:br] 
  (label "location" "File location: ")
  (text-field :txtlocation)[:br]

  (label "duration" "Duration(minutes): ")
  (text-field  :txtduration)[:br]
  (submit-button "Save"))]))

现在,这可行,但我想将用户导航到相同的“添加新电影”页面,或者在单击“保存”按钮后刷新表单,而不是只显示一个空白页面。

这是 GET\POST 部分:

 (GET "/addfilm" [] (view-film-input))
 (POST "/addfilm" [txtname txtprname txtlocation txtduration]
    (insert-flick txtname txtprname txtlocation txtduration 90) )

提前致谢!

【问题讨论】:

  • 我认为这是组合。您的视图需要返回响应。 insert-flick 返回什么?
  • 它在另一个类中定义,该类管理数据库。将新电影添加到表中,使用 txtname、txtprname、txtlocation 和 txtduration 作为属性

标签: forms post clojure get submit-button


【解决方案1】:

这里有两种可能。

重定向用户

使用 HTTP 302(或 303)响应的 Location 标头,您可以指定用户浏览器应显示的路径而不是当前路径:

(POST "/addfilm" [...]
  ...
  {:status 302
   :headers {"Location" "/addfilm"}})

ring.util.response 中还有两个函数可以为您生成响应:redirectredirect-after-post - 后者更适用于您的用例。

编辑:This answer 详细说明了为什么 303 会是在 POST 之后发送的状态码,具体来说:

如果您使用 302,您将面临 UA 将重新发送 POST 到新 URL 而不是切换到 GET 的风险。

再次渲染同一页面

更简单且提示更少的 I/O,但强加一些重复将是再次渲染相同的视图,即:

(POST "/addfilm" [...]
  ...
  (view-film-input))

这对我来说似乎不太容易维护,但它可能是解决问题的最短路径。

【讨论】:

  • 非常感谢,非常感谢您的快速响应
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-16
  • 1970-01-01
  • 1970-01-01
  • 2014-05-31
  • 2012-11-24
  • 2020-12-15
  • 2021-04-04
相关资源
最近更新 更多