【问题标题】:How to pass spring model attributes as parameters in Thymeleaf fragments如何在 Thymeleaf 片段中将弹簧模型属性作为参数传递
【发布时间】:2014-05-15 00:53:27
【问题描述】:

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

这很好用,但我有很多重复,所以我想创建一个 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 作为参数传递到片段中,而 thymeleaf 将使用它而不是 ${worker}

NewWorker 在 spring 动作中设置为:

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

上面的代码是不可能的。这里 thymeleaf 想要解析 worker 而不是传入的 newWorker。参数应该是另一种格式,还是百里香片段无法解决这个问题?

【问题讨论】:

    标签: spring thymeleaf


    【解决方案1】:

    有一个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

    【讨论】:

    • 我的问题是当我尝试使用参数 worker 就像在 thymeleaf 想将其解析为 spring bean 却找不到。但它不应该解析 worker 而应该使用提供的参数,如 ${newWorker}
    • 如果要传入值,需要使用th:value="${newWorker.name}" th:field 用于绑定表单支持的bean。
    • 是的,我想绑定到表单支持的 bean。但我想用一个参数来决定应该使用哪个 bean。所以在我上面的例子中,worker 只是 newWorker 的实际 bean 的占位符。因此,例如将参数 newWorker 赋予片段而不是 thymeleaf 应该使用 。我认为百里香是不可能的。
    【解决方案2】:

    我通过将字段名称传递到片段而不是传递属性本身解决了类似的问题。因此,从您的包含中,您将编写如下内容:

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

    然后对于您的片段,您将拥有相同的“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>
    

    【讨论】:

    • 有点通向黑暗面的路径,但如果你真的需要th:fieldth:include,似乎没有其他办法。
    猜你喜欢
    • 2017-05-20
    • 2020-06-02
    • 2021-07-24
    • 1970-01-01
    • 2020-04-21
    • 2011-08-15
    • 1970-01-01
    • 2021-03-30
    • 1970-01-01
    相关资源
    最近更新 更多