4

我想开发一个 Lift web 应用程序,我有一个索引页面,这里有一个正文:

<div id="main" class="lift:surround?with=default&at=content">
  <div> App </div> 
  <div>
    <form method="post" class="lift:DumbForm">
       <table>
            <tr><td> Email:</td> <td><input name="email" type="text"></td></tr>
            <tr><td> Password:</td> <td><input name="pwd" type="password"></td></tr>
            <tr><td> Name:</td> <td><input name="name" type="text"></td></tr>
            <tr><td><input type="submit" value="Sign in"></td> <td><input type="reset" value="Reset"></td></tr>
        </table>
    </form>
  </div> 
</div>

使用相应的片段(文件“DumbForm.scala”):

package code
package snippet

import net.liftweb._
import http._
import scala.xml.NodeSeq

/**
 * A snippet that grabs the query parameters
 * from the form POST and processes them
 */
object DumbForm {
  def render(in: NodeSeq): NodeSeq = {  
    // use a Scala for-comprehension to evaluate each parameter
    for {
      r <- S.request if r.post_? // make sure it's a post
      name <- S.param("name") // get the name field
    } {
      S.notice("Nom: "+name)
      S.redirectTo("/hello")
    }

    // pass through the HTML if we don't get a post and
    // all the parameters
    in
  }
}

我想将此片段中的属性“名称”传递给另一个视图,即 HTML 页面(“hello.html”),它将获取并显示该名称。

但是我不知道如何将片段中的“name”参数传递给视图(hello.html),以及如何在视图中获取此参数?!

此刻,我的 hello.html 有:

<body>
<p> Hello ... (you must display the name!)</p>
</body>
4

1 回答 1

2

要执行您想做的事情,您只需将表单直接指向hello.html已安装的位置。我假设它hello在同一条路径上。

哑形式.html

<div id="main" class="lift:surround?with=default&at=content">
  <div> App </div> 
  <div>
    <form method="post" action="hello">
       <table>
            <tr><td> Email:</td> <td><input name="email" type="text"></td></tr>
            <tr><td> Password:</td> <td><input name="pwd" type="password"></td></tr>
            <tr><td> Name:</td> <td><input name="name" type="text"></td></tr>
            <tr><td><input type="submit" value="Sign in"></td> <td><input type="reset" value="Reset"></td></tr>
        </table>
    </form>
  </div> 
</div>

你好.html

<div data-lift="ShowHelloSnippet">
  <p>Hello <span name="paramname"></span></p>
</div>

片段

class ShowHelloSnippet {
  def render = {
    "@paramname" #> S.param("name")
  }
}

更多的 Lift 方法是使用 Lift 的SHtml 表单元素

哑形式.html

<div id="main" class="lift:surround?with=default&at=content">
  <div> App </div> 
  <div>
    <form method="post" data-lift="FormHandlerSnippet">
       <table>
            <tr><td> Email:</td> <td><input name="email" type="text"></td></tr>
            <tr><td> Password:</td> <td><input name="pwd" type="password"></td></tr>
            <tr><td> Name:</td> <td><input name="name" type="text"></td></tr>
            <tr><td><input id="submitbutton" type="submit" value="Sign in"></td> <td><input type="reset" value="Reset"></td></tr>
        </table>
    </form>
  </div> 
</div>

片段

class MyFormResponse(
    var email:String="", 
    var password:String="", 
    var name:String ="")

class FormHandlerSnippet {

  def render = {
     val responseForm = new MyFormResponse()
     "@email" #> SHtml.text("", (valueSupplied) => {
        responseForm.email = valueSupplied
     }) &
     "@pwd" #> SHtml.password("", (valueSupplied) => {
        responseForm.password = valueSupplied
     }) &
     "@name" #> SHtml.text("", (valueSupplied) => {
        responseForm.name = valueSupplied
     }) &
     "#submitbutton" #> SHtml.submit("Sign In", () => {
        S.redirectTo("/hello", () => ShowHelloSnippet.myVals(Full(responseForm)))
     })
  }
}

你好.html

<div data-lift="ShowHelloSnippet">
  <p>Hello <span name="paramname"></span></p>
</div>

片段

object ShowHelloSnippet {
  object myVals extends RequestVar[Box[MyFormResponse]](Empty)
}

class ShowHelloSnippet {
  def render = "*" #> {
    ShowHelloSnippet.myVals.get.map { r =>
      "@paramname" #> r.name
    }
  }
}

这将在对象上设置表单值,然后执行有状态重定向,该重定向设置值以ShowHelloSnippet供您在页面被重定向后使用。作为两者的替代方案,您可以使用 Ajax 在同一页面上简单地显示值。

于 2013-04-18T15:34:28.480 回答