如何将Spring模型属性作为参数传递给Thymeleaf片段

时间:2014-04-03 09:34:03

标签: spring thymeleaf

我有一个简单的基于CRUD thymeleaf的html页面,其中列出了工人和工人的详细信息。现在我想创建,编辑或删除一个工人。对于这个动作,我使用了一个twitter bootstrap模态对话框。

这很好用,但我有很多重复,所以我想创建一个th:fragment,其中包含在详细信息视图中相同的表单字段,创建视图和编辑视图。只是弹簧模型属性是不同的。

<div th:fragment="workerForm(formId, formAction, worker)">
  <form th:id="${formId}" th:action="${formAction}" class="form-horizontal" method="post" role="form">
    <div class="form-group">
      <label for="inputGivenName" class="col-sm-2 control-label">Givenname</label>
      <div class="col-sm-10">
        <input id="inputGivenName" type="text" class="form-control" th:field="${worker.givenName}"/>
      </div>
    </div>
    <div class="form-group">
      <label for="inputName" class="col-sm-2 control-label">Name</label>
      <div class="col-sm-10">
        <input id="inputName" type="text" class="form-control" th:field="${worker.name}"/>        
      </div>
    </div>        
    <div class="form-group">
      <div class="col-sm-offset-2 col-sm-10">        
        <div class="checkbox">        
          <label>
          <input type="checkbox" th:field="${worker.active}"/> Active
          </label>
        </div>
      </div> 
    </div>                          
  </form>
</div>

现在我想将这个片段包含在模态对话框中......

<div class="modal-body">
  <div th:include="workerFragments :: workerForm(newWorkerForm, @{/worker/new}, ${newWorker})"></div>
</div>

是否可以将模型属性 newWorker 作为参数传递到片段中,百里香叶将使用​​此代替 $ {worker}

NewWorker在spring动作中设置为:

....
model.addAttribute("newWorker", new WorkerDTO());
....

上述代码无法实现。在这里,百万美元想要解决工作人员而不是传入 newWorker 。该参数应该采用其他格式,还是百万美元片段无法解决这个问题?

2 个答案:

答案 0 :(得分:10)

我通过将字段的名称传递给片段而不是传递属性本身来解决类似的问题。所以从你的include中,你会写出类似的东西:

<div class="modal-body">
  <div th:include="workerFragments :: workerForm(newWorkerForm, @{/worker/new}, 'newWorker')"></div>
</div>

然后使用你的片段,你将拥有相同的&#34;工人&#34;片段变量,但您必须使用预处理器来评估片段中的变量,然后您可以使用表单支持语法来使用th:field。您的片段中的引用从$ {worker}更改为* {__ $ {worker} __}

<div th:fragment="workerForm(formId, formAction, worker)">
  <form th:id="${formId}" th:action="${formAction}" class="form-horizontal" method="post" role="form">
    <div class="form-group">
      <label for="inputGivenName" class="col-sm-2 control-label">Givenname</label>
      <div class="col-sm-10">
        <input id="inputGivenName" type="text" class="form-control" th:field="*{__${worker}__.givenName}"/>
      </div>
    </div>
    <div class="form-group">
      <label for="inputName" class="col-sm-2 control-label">Name</label>
      <div class="col-sm-10">
        <input id="inputName" type="text" class="form-control" th:field="*{__${worker}__.name}"/>        
      </div>
    </div>        
    <div class="form-group">
      <div class="col-sm-offset-2 col-sm-10">        
        <div class="checkbox">        
          <label>
          <input type="checkbox" th:field="*{__${worker}__.active}"/> Active
          </label>
        </div>
      </div> 
    </div>                          
  </form>
</div>

答案 1 :(得分:8)

有一个with属性,您可以在其中将参数传递到视图中,这样您就不会依赖父级。例如,

如果您致电workerForm,并且想要传递名为newWorker的参数newWorkerValue,那么您可以执行以下操作:

<div class="modal-body">
  <div th:include="workerFragments :: workerForm" th:with="newWorker=${newWorkerValue}"></div>
</div>

因此,在您的workerForm模板中,您可以引用newWorker。有关其他信息,请查看8.2 Parameterizable fragment signatures