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

Mar*_*arc 11 spring thymeleaf

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

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

<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>
Run Code Online (Sandbox Code Playgroud)

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

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

是否可以将模型属性newWorker作为参数传入片段,而thymeleaf将使用此而不是$ {worker}

NewWorker在spring动作中设置为:

....
model.addAttribute("newWorker", new WorkerDTO());
....
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*Jon 10

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

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

然后使用您的片段,您将拥有相同的"worker"片段变量,但您必须使用预处理器来评估片段中的变量,然后您可以使用表单支持语法来使用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>
Run Code Online (Sandbox Code Playgroud)


Joh*_* F. 8

有一个with属性可以将参数传递到视图中,因此您不依赖于父级.例如,

如果您正在调用workerForm并且想要传入一个名为newWorkervalue的参数newWorkerValue,那么您将执行以下操作:

<div class="modal-body">
  <div th:include="workerFragments :: workerForm" th:with="newWorker=${newWorkerValue}"></div>
</div>
Run Code Online (Sandbox Code Playgroud)

因此,在您的workerForm模板中,您可以参考newWorker.有关其他信息,请查看8.2可参数化片段签名

  • 是的我想绑定到表单支持的bean.但我想用一个参数决定应该使用哪个bean.所以在上面的例子中,**worker**只是实际bean的占位符,它是**newWorker**.因此,例如将参数**newWorker**赋予片段而不是**<input ... th:field ="$ {worker.name}"/>**thymeleaf应该使用**<input ... th :字段= "$ {newWorker.name}"/>**.我认为百里香叶不可能做到这一点. (2认同)