我已经在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"))]))
现在,这有效,但我想将用户导航到同一个"添加新电影"页面,或点击&#34后刷新表单;保存"按钮,而只显示一个空白页面。
这是GET \ POST部分:
(GET "/addfilm" [] (view-film-input))
(POST "/addfilm" [txtname txtprname txtlocation txtduration]
(insert-flick txtname txtprname txtlocation txtduration 90) )
提前致谢!
答案 0 :(得分:2)
这里有两种可能性。
重定向用户
使用HTTP 302(或303)响应的Location
标头,您可以指定用户浏览器应显示的路径而不是当前路径:
(POST "/addfilm" [...]
...
{:status 302
:headers {"Location" "/addfilm"}})
ring.util.response
中还有两个函数可以为您生成响应:redirect
和redirect-after-post
- 后者更适用于您的用例。
编辑: This answer详细说明为什么303将是POST后发送的状态代码,具体为:
如果您使用302,则表示UA会将POST重新发送到新网址而不是切换到GET。
再次呈现相同的网页
更简单并提示更少的I / O,但实施一些重复将是再次呈现相同的视图,即:
(POST "/addfilm" [...]
...
(view-film-input))
这对我来说似乎不太可维护,但它可能是解决问题的最短路径。