Grails和AJAX:使用ModalBox或YUI2 Dialog进行Grails表单验证?

时间:2010-07-11 00:15:53

标签: ajax grails yui grails-plugin grails-validation

几个Grails应用程序,比如我正在编写的应用程序,需要一个/用户视图和/ admin视图,它们是'仪表板',基本上是用户或管理员登陆该页面,可能是在成功登录后所有数据表和标签就在那里,所以他们几乎不需要离开那个页面,提供更令人满意的用户体验,比如Gmail或Mint的用户已经习以为常。

为了允许从主/用户信息中心进行搜索和表单发布,我一直在使用modalbox插件v0.4 grails install modalbox。 Modalbox显然正在管理GET / POST本身,不幸的是,它失去了典型约束块为您提供的99%的验证。

现在通过替换g:submitButton解决这个问题,在提交中放置一些基本的JavaScript,如图所示。 (当然,这是一个糟糕的解决方法。)

<input type="button" name="create" class="save" onclick="if (!(document.getElementById('name').value === '' || document.getElementById('summary').value === '')) { document.forms[0].submit(); }" value="Create" />

但必须有更好的方法!我被告知要使用g:remoteForm,但还没有看到一个完整的示例与Modalbox一起工作。也许人们正在使用一个新窗口,它会像Gmail的撰写窗口一样自动关闭几秒钟?

这可能是一个常见的场景,对于SiteMesh模板来说已经成熟,或者至少是“渲染模板:”,甚至是像modalBox这样的GSP标签:createLink。

Gtown项目空间中的可用资源here

1 个答案:

答案 0 :(得分:1)

Modalbox上的示例已在灯箱中隐藏了验证错误:&lt; p style =“display:none”&gt;无效的电子邮件!&lt; / p&gt;所以我想如果你想使用Grails验证,你必须自己控制表单。在这种情况下,灯箱插件只负责绘制灯箱,并且您将提供所有表单内容。

我使用Boxy(另一个灯光插件应该与你的Modalbox类似),这里是我在灯箱中使用Grails验证的一个例子。当我创建灯箱时,我使用“shell”动作来填充它。 shell操作呈现模板,模板内部是&lt; g:include&gt;这是第一次绘制搜索表单。 &LT; G:formRemote&GT;调用验证操作并使用验证操作的结果重新绘制灯箱的内容。结果可以是成功页面或验证错误页面。

在此示例中,使用命令对象SearchCommand仅用于演示。

控制器:

def launchLightbox = {
    render template: 'lightboxFrame'
}

def lightboxContents = { SearchCommand cmd ->

    // if the search failed, re-draw the search form with validation errors
    if (cmd.hasErrors()) {
        return [cmd: cmd]
    } 

    // the search succeeded. Show the results within the lightbox
    else {
        render template: 'searchResults', model: [results: cmd.results]
    }
}

_lightboxFrame.gsp:

<g:formRemote name="searchLightbox" 
        url="[action: 'lightboxContents']" update="lightboxContentsDiv">
    <div id="lightboxContentsDiv">
        <g:include view="/yourController/_lightboxContents.gsp"/>
    </div>
</g:formRemote>

_lightboxContents.gsp:

<g:renderErrors bean="${cmd}"/>
<p>Enter your search:</p>
<g:textField name="search" value="${cmd?.search}"/>
<g:submitButton name="submitButton" value="Submit"/>

如果您希望在搜索成功或失败时更多地控制要执行的操作,例如要么在失败时呈现验证错误,要么在成功时关闭灯箱,您可能需要编写自己的javascript回调。

与此问题有些相关,可能对您有所帮助,是Grails Remote Constraints plugin。我有一段时间没有尝试过,但您应该可以使用它来重新绘制部分页面,并与Grails生成的验证错误异步。