5

使用 Grails 时,渲染每个表单字段的 GSP 代码如下所示:

<tr class="prop">
  <td valign="top" class="name"><label for="username">Login Name:</label></td>
  <td valign="top" class="value ${hasErrors(bean: person, field: 'username', 'errors')}">
    <input type="text" id="username" name="username" value="${person.username?.encodeAsHTML()}"/>
  </td>
</tr>

<tr class="prop">
  <td valign="top" class="name"><label for="userRealName">Full Name:</label></td>
  <td valign="top" class="value ${hasErrors(bean: person, field: 'userRealName', 'errors')}">
    <input type="text" id="userRealName" name="userRealName" value="${person.userRealName?.encodeAsHTML()}"/>
  </td>
</tr>

<tr class="prop">
  <td valign="top" class="name"><label for="passwd">Password:</label></td>
  <td valign="top" class="value ${hasErrors(bean: person, field: 'passwd', 'errors')}">
    <input type="password" id="passwd" name="passwd" value="${person.passwd?.encodeAsHTML()}"/>
  </td>
</tr>

请注意,每个表单域都重复了几乎完全相同的 5 行 GSP/HTML 代码。这对我来说似乎不是很干燥,我想知道其他人是否找到了更好的方法?

我找到了 2 个试图解决这个问题的插件,form helperbean-fields。如果有人有使用这两种方法的经验,我很想听听他们的意见。或者,如果有其他解决方案/插件,请告诉我。

谢谢。大学教师

4

3 回答 3

8

对于那些将来阅读此线程的人 - 对于 grails 2.x 分支,建议使用Grails 字段插件而不是 bean 字段,它实际上是 bean-fields 的继承者,并提供覆盖默认模板的灵活性

于 2012-04-19T06:49:28.030 回答
5

使用bean-field 插件。您的代码将变为:

<bean:withBean beanName="person">
    <bean:field property="username" label="Login Name:"/>
    <bean:field property="userRealName" label="Full Name:"/>
    <bean:field property="passwd" label="Password:"/>
</bean:withBean>

您能找到 DRYer 解决方案吗?

于 2010-01-25T19:01:16.383 回答
5

是的,bean-fields 插件非常 DRY……你的 20 行可以替换为一行:

<bean:form beanName="person" properties="username, userRealName, passwd”/>

(假设您设置了 i18n 属性)

于 2010-01-25T19:25:45.857 回答