2017-01-05 4 views
1

У меня есть контроллер Spring MVC, который возвращает имя фрагмента тимелеафа для просмотра компонента resolver. Проблема в том, что этот фрагмент нуждается в URL-адресе в качестве параметра. Здесь я помещаю фрагмент:Как передать параметры в Thymeleaf Ajax Fragment

 <!-- 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> 

Я не могу получить способ передать этот параметр без получения ошибки. Контроллер выглядит следующим образом:

@RequestMapping(method = RequestMethod.GET) 
public String show(@CurrentUser User user, Model model) { 
    logger.info(user.toString()); 
    if(!model.containsAttribute(BINDING_RESULT_NAME)) { 
     model.addAttribute(ATTRIBUTE_NAME, user); 
    } 
    model.addAttribute("url", "/admin/users/self/profile"); 
    return "admin/fragments/user/personal::form-basic({url})"; 
} 

Для приведенного выше примера, я получаю следующее сообщение об ошибке:

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')"; 

В целом я получаю ошибку

+0

Не могли бы вы добавить текст ошибки? –

+0

Извините, кен, я добавил выше, исключение, которое я получаю. –

ответ

3

У вас есть два способа для параметра pass от контроллера до фрагмента 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 в модель.

+0

Спасибо, Кен, очень хорошее объяснение –

1

Все, что вам нужно сделать, это включить ваш параметр 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}"> 
+0

Использование @ {...} не генерирует никакого URL-адреса, поле действия остается как action = "url" –

+0

Хорошо, нужно положить th: action = "@ {$ {url} } "для создания правильного URL-адреса. –

+0

Конечно, знак доллара также нужен –