几个Grails应用程序(例如我正在编写的应用程序)需要一个/ user View 和/ admin View ,它们是“仪表板”,基本上,该用户或admin可以登陆该页面,可能是在成功登录后并且所有数据表和选项卡都在那里,因此他们几乎不需要导航到该页面,即可提供更令人满意的用户体验,例如Gmail或Mint用户已经习惯了。
为了允许从主/ user仪表板进行搜索和形成帖子,我一直在使用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模板,或者至少是“渲染模板:”甚至是GSP标签(如modalBox:createLink),这种情况很常见,以至于已经成熟。
Gtown项目空间中可用的
here源。
Modalbox上的示例的灯箱中已经隐藏了验证错误:
无效的电子邮件! p>,因此,我认为如果您要使用Grails验证,则必须控制形成自己。在这种情况下,灯箱插件仅负责绘制灯箱,您将提供所有表单内容。
我使用Boxy(另一个灯箱插件,该插件应与您的Modalbox相似),这是我如何在灯箱中使用Grails验证的示例。创建灯箱时,我会使用“ shell ”操作来填充它。 shell操作将呈现一个模板,并且在模板内部是一个,它会第一次绘制搜索表单。 调用验证操作,并使用验证操作的结果重绘灯箱的内容。结果可能是成功页面或验证错误页面。
命令对象(在本示例中为SearchCommand)的使用仅用于演示。
Controller :
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生成的验证错误,从而异步重绘页面的某些部分。