UrlMappings和Forms - 它们如何工作?

时间:2012-02-23 19:11:27

标签: forms grails url-mapping urlmappings.groovy

UrlMappings是一个很棒的链接功能,但它们也适用于表单吗?

假设我们有这样的映射:

"/map/$a" {
    controller="form"
    action="show"
}

现在将<g:link controller="form" action="show" params="[a:'test'] />重写为 <a href="/appname/map/test" />

但是这样的形式:

<g:form controller="form" action="show">
   <g:textField name="a" />
</g:form>

不会有同样的效果。这将导致请求/appname/form/show?a=whatever

我知道表单不能像HTML一样在HTML创建时重写 - 主要是因为此时参数的值不知道,但我希望这个URL会被重定向到& #34;漂亮&#34; URL。

有没有办法在grails中做这样的事情?或者我是否必须编写自己的重定向?

2 个答案:

答案 0 :(得分:1)

正如您所提到的,由于未知的参数值,在页面渲染时无法完成。此外,您可以想象一旦超出一个表格字段后会出现的问题。

您可以编写一些JavaScript来在onSubmit中创建一个漂亮的URL,或者如果您在整个地方都可以创建一个自定义标记。

答案 1 :(得分:1)

我想我找到了答案:

URL重写似乎只在HTML呈现时才起作用。 所以

<g:form controller="form" action="show" params="[a:'test']">
   <g:textField name="b" />
</g:form>

将导致/appname/map/test。但这不是我想要的 - 我希望在提交表单时重写URL。

所以我想出了一个重定向行动:

class FormController {

    def index() { }
    def show() {
        render("yep"+params.a)
    }
    def submit() {
        redirect(controller:'form',action:'show',params:params)
    }
}

我将表单重写为

<g:form controller="form" action="submit">
   <g:textField name="a" />
</g:form>

这似乎很有效(以一次重定向为代价)