4

假设我有一个域对象 Teacher,它有两个字段 String 名称、TeacherType TeacherType,其中 TeacherType 是一个包含 AssitantProfessor、AssociateProfessor、Professor 的枚举。

在我使用 grails run-target generate-all Teacher 生成视图后,它会生成一个用于创建和编辑 Teacher 的 _form.gsp。在编辑视图中,我只希望名称是可编辑的,但 TeacherType 一旦创建就不可修改(这只是一个示例,要求某些字段在创建后不能更新)。在创建视图中,TeacherType 和 name 都应该是可编辑的。

由于 create.gsp 和 edit.gsp 都呈现 _form 模板,这里首选的方法是什么?

  1. 创建两个单独的模板,即 _formCreate.gsp 、 _formEdit.gsp;或者
  2. 在 create.gsp 和 edit.gsp 中传入模型映射并在 _form.gsp 中使用它们来有条件地渲染视图?例如

在 create.gsp 中:

    <fieldset class="form">
        <g:render template="form" model="[teacherInstance: teacherInstance, 'mode':'create']"/>
    </fieldset>

在edit.gsp

    <fieldset class="form">
        <g:render template="form" model="[teacherInstance: teacherInstance, 'mode':'edit']"/>
    </fieldset>

在 _form.gsp 中

    <g:if test="${mode == 'edit'}">
        <g:select name="teacherType" from="${TeacherType?.values()}" keys="${TeacherType.values()*.name()}" required="" value="${teacherInstance?.teacherType?.name()}" disabled="disabled"/>
    </g:if>
    <g:else>
        <g:select name="teacherType" from="${TeacherType?.values()}" keys="${TeacherType.values()*.name()}" required="" value="${teacherInstance?.teacherType?.name()}" disabled="false"/>
    </g:else>

方法 2 有效,但我想如果条件语句的数量增加,遵循方法 1 并拆分表格可能会更好。

还有另一种我不知道的方法吗?

4

1 回答 1

5

(以及许多其他表单字段标签)的disabled属性可以是布尔值表达式:<g:select><g:...>

<g:select name="teacherType" from="${TeacherType?.values()}"
  keys="${TeacherType.values()*.name()}" required=""
  value="${teacherInstance?.teacherType?.name()}"
  disabled="${mode == 'edit'}"/>

这将呈现为disabled="disabled"好像表达式的计算结果为 true,并且如果表达式为 false,则呈现为缺少disabled属性(即不会禁用该字段)。您甚至可以在模型中使用布尔条目,例如使用

model="[teacherInstance: teacherInstance, editing:true]"

(或editing:false分别)然后disabled="${editing}"在 上说<g:select>

于 2013-02-12T22:28:10.197 回答