如何将参数传递给Thymeleaf Ajax片段

如何将参数传递给Thymeleaf Ajax片段,ajax,spring,spring-mvc,thymeleaf,Ajax,Spring,Spring Mvc,Thymeleaf,我有一个SpringMVC控制器,它返回thymeleaf片段的名称以查看解析器bean。问题是这个片段需要一个url作为参数。这里我把片段放在这里: <!-- A fragment with wrapper form for basic personal information fragment --> <th:block th:fragment="form-basic(url)"> <form role="form" th:action="$

我有一个SpringMVC控制器,它返回thymeleaf片段的名称以查看解析器bean。问题是这个片段需要一个url作为参数。这里我把片段放在这里:

     <!-- A fragment with wrapper form for basic personal information fragment -->
 <th:block th:fragment="form-basic(url)">
    <form role="form" th:action="${url}" method="post" th:object="${user}">
         <th:block th:replace="admin/fragments/alerts::form-errors"></th:block>
         <th:block th:include="this::basic" th:remove="tag"/>
         <div class="margiv-top-10">
              <input type="submit"  class="btn green-haze" value="Save" th:value="#{admin.user.form.save}" />
              <input type="reset"  class="btn default" value="Reset" th:value="#{admin.user.form.reset}" />
        </div>
  </form>
</th:block>
对于上面的示例,我得到以下错误:

06-Jan-2017 11:36:40.264 GRAVE [http-nio-8080-exec-9] org.apache.catalina.core.StandardWrapperValve.invoke El Servlet.service() para el servlet [dispatcher] en el contexto con ruta [/ejercicio3] lanzó la excepción [Request processing failed; nested exception is java.lang.IllegalArgumentException: Invalid template name specification: 'admin/fragments/user/personal::form-basic({url})'] con causa raíz
 java.lang.IllegalArgumentException: Invalid template name specification: 'admin/fragments/user/personal::form-basic({url})'
    at org.thymeleaf.spring4.view.ThymeleafView.renderFragment(ThymeleafView.java:275)
    at org.thymeleaf.spring4.view.ThymeleafView.render(ThymeleafView.java:189)
    at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1257)
    at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1037)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:980)
我做了以下测试:

 "admin/fragments/user/personal::form-basic('{url}')";
"admin/fragments/user/personal::form-basic(@{/admin/users/self/profile})";
"admin/fragments/user/personal::form-basic(/admin/users/self/profile)";
"admin/fragments/user/personal::form-basic('/admin/users/self/profile')";

在所有我得到的错误中,您有两种方法将参数从控制器传递到Thymeleaf片段。首先是通常的弹簧方式-抛出模型:

@RequestMapping(method = RequestMethod.GET)
public String show(@CurrentUser User user, Model model) {
   model.addAttribute("url", "/admin/users/self/profile");
   return "admin/fragments/user/personal::form-basic";
}
够了。在这种情况下,您不需要指定任何片段参数(即使您有)

第二种方法是在片段名称中指定参数:

@RequestMapping(method = RequestMethod.GET)
public String show(@CurrentUser User user, Model model) {
   String url = "/admin/users/self/profile";
   return String.format("admin/fragments/user/personal::form-basic(url='%s')",url);
}

注意,必须指定参数的名称,并且字符串值必须放在单引号中。在这种情况下,您不需要将
url
变量添加到模型中。

您所需要做的就是将url参数作为模型属性(就像您所做的那样)。不需要以任何方式通知片段名称。只需返回片段名称,因为它没有参数

// rest of method body omitted
model.addAttribute("url", "/admin/users/self/profile");
return "admin/fragments/user/personal::form-basic";
顺便说一句。我看到您的url指向其他端点。在这种情况下,您应该在表单的
th:action
属性中以
@{…}
的方式使用它

<form role="form" th:action="@{${url}}" method="post" th:object="${user}">


您能添加错误文本吗?对不起,ken,我在上面添加了异常。使用@{…}不会生成任何url,操作字段保持为action=“url”Ok,需要将th:action=“@{${url}}”放入以生成正确的url。@JakubCh。如何从控制器返回这一页的多个片段?@Atanu我不知道我是否正确。。。是否要一次返回单个模板文件中的几个片段?我马上说的意思是:作为控制器方法的一次调用的结果。@Atanu如果上面是真的。。。然后,您可以使用选择所需的片段。例如:有一个名为index.html的模板,其中包含元素
F1F2不包含f3
,并且在控制器的方法中有一个return语句,如
return“index::.fragment class”
然后您应该在浏览器中获得
F1 F3
。我希望我能以一种可以理解的方式解释它?这很简单。如果我想使用你的第二个解决方案并在fragment参数中传输一个对象,我该怎么办?@OlivierBoissé使用第二个解决方案,你可以只传递诸如
字符串
整数
等基本类型。如果你要传递对象,你应该将其与
模型
一起传递。
<form role="form" th:action="@{${url}}" method="post" th:object="${user}">