我正在构建一个 Lift 应用程序,其中一个页面基于 Lift 演示中的“文件上传”示例,网址为:http://demo.liftweb.net/file_upload .
如果你看source code for that page ...您会看到有一个 Lift“snippet”标签,围绕着两个“choose”标签:
<lift:snippet type="misc:upload" form="post" multipart="true">
<choose:post>
<p>
File name: <ul:file_name></ul:file_name><br >
MIME Type: <ul:mime_type></ul:mime_type><br >
File length: <ul:length></ul:length><br >
MD5 Hash: <ul:md5></ul:md5><br >
</p>
</choose:post>
<choose:get>
Select a file to upload: <ul:file_upload></ul:file_upload><br >
<input type="submit" value="Upload File">
</choose:get>
</lift:snippet>
这个想法是,当用户第一次点击页面(即 GET 请求)时,Lift 将显示用于上传文件的表单。当用户提交表单(即对同一页面的 POST 请求)时,Lift 会显示正在处理的文件的结果。
对于我的应用程序,新的问题是我的“结果”POST View 需要还包含一个表单。我想提供一个文本输入,供用户输入电子邮件地址,以及一个提交按钮,按下该按钮将通过电子邮件发送有关已处理文件的信息:
...
<choose:post>
<p>
File name: <ul:file_name></ul:file_name><br >
MIME Type: <ul:mime_type></ul:mime_type><br >
File length: <ul:length></ul:length><br >
MD5 Hash: <ul:md5></ul:md5><br >
</p>
<!-- BEGIN NEW STUFF -->
Output: <br/>
<textarea rows="30" cols="100"><ul:output></ul:output></textarea>
<br/><br/>
Email the above output to this email address:<br/>
<ul:email/><br/>
<input type="submit" value="Email"/>
<!-- END NEW STUFF -->
</choose:post>
...
但是,此页面的 GET 和 POST 版本都由相同的 Lift 生成的表单包装,在这两种情况下,该表单的“操作”都设置为相同的代码段。如何更改此设置,以便在 POST 版本中,表单的操作更改为不同的代码段?
在典型的 Web 框架中,我会使用“onclick”事件和两行基本 JavaScript 来实现类似的操作。然而,我什至还没有开始思考 Lift 的……呃,关于在 Scala 中编写 JavaScript 的有趣概念。也许我需要走这条路,或者也许有更好的方法。
最佳答案
首先,我建议您使用 Lift 的新设计器友好型 CSS 绑定(bind),而不是自定义 XHTML 标记。
当您使用 Lift 的代码片段时,您应该记住的一件事是,它是递归的,您可以将 lift 代码片段放入另一个代码片段的 HTML block 中。
例如,如果您希望 POST 之后有另一个表单,则只需将其放入 block 中即可。
<choose:post>
<p>
File name: <ul:file_name></ul:file_name><br >
MIME Type: <ul:mime_type></ul:mime_type><br >
File length: <ul:length></ul:length><br >
MD5 Hash: <ul:md5></ul:md5><br >
</p>
<!--
The following is same as <lift:snippet type="EMailForm" form="post" multipart="true">
-->
<form action="" method="post" data-lift="EMailForm">
<input type="text" name="email"/>
<input type="submit" />
</form>
</choose:post>
然后在代码片段类 EMailForm 中处理电子邮件表单操作。
最后,您可以使用隐藏表单元素或SessionVar传递文件名/minetype等信息。
关于scala - 如何在 Lift 中更改表单的操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10952482/