【问题标题】:UrlMappings and Forms - how do they work?UrlMappings 和表单 - 它们是如何工作的?
【发布时间】:2012-02-23 19:11:27
【问题描述】:

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

假设我们有这样的映射:

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

a <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 创建时被重写——主要是因为此时参数的值是未知的,但我希望这个 URL 会被重定向到“nice”网址。

有没有办法在 grails 中做类似的事情?还是我必须自己编写重定向?

【问题讨论】:

    标签: forms grails url-mapping urlmappings.groovy


    【解决方案1】:

    正如你所说,由于参数值未知,无法在页面渲染时完成。另外,您可以想象一旦超出一个表单域会出现的问题。

    您可以编写一些 JavaScript 来在 onSubmit 中创建一个漂亮的 URL,或者如果这是您在各处执行的操作,您可能会创建一个自定义标记。

    【讨论】:

    • javascript 是个好主意——它也能解决我的另一个问题!谢谢!
    【解决方案2】:

    我想我已经找到了答案:

    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>
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-05
      • 1970-01-01
      • 1970-01-01
      • 2015-02-11
      • 2014-09-08
      • 1970-01-01
      • 2010-11-14
      相关资源
      最近更新 更多