2017-01-05 2 views
1

Ich habe einen Spring MVC-Controller, der den Namen eines Thymeleaf-Fragments zurückgibt, um Resolver-Bean anzuzeigen. Das Problem ist, dass dieses Fragment eine URL als Parameter benötigt. Hier stelle ich das Fragment:Wie Parameter an Thymeleaf Ajax Fragment übergeben

Ich kann keinen Weg finden, diesen Parameter zu übergeben, ohne einen Fehler zu bekommen. Die Steuerung ist wie folgt:

@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})"; 
} 

Für das obige Beispiel ich die folgende Fehlermeldung erhalten:

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) 

ich diese Tests durchgeführt haben:

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

In alles, was ich bekommen Fehler

+0

Können Sie Textfehler hinzufügen? –

+0

Sorry, ich habe oben die Ausnahme hinzugefügt, die ich bekomme. –

Antwort

3

Sie haben zwei Möglichkeiten, Parameter vom Controller zum Thymeleaf-Fragment zu übergeben. Zuerst ist der übliche Frühling Weg - werfen Sie das Modell:

@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"; 
} 

Das ist genug. In diesem Fall müssen Sie keine Fragmentparameter angeben (selbst wenn Sie sie haben).

zweiter Weg ist, Parameter in Fragmentnamen angeben:

@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); 
} 

Beachten Sie, dass Name Parameter angegeben werden muss, und der String-Wert muss in einfachen Anführungszeichen gesetzt werden. In diesem Fall brauchen Sie keine Variable url in das Modell einzufügen.

+0

Danke Ken, sehr gute Erklärung –

1

Alles, was Sie tun müssen, ist Ihren URL-Parameter als Modellattribut (wie Sie). Sie müssen Ihren Fragmentnamen in keiner Weise mitteilen. Geben Sie den Fragmentnamen einfach zurück, da er keine Parameter hätte.

// rest of method body omitted 
model.addAttribute("url", "/admin/users/self/profile"); 
return "admin/fragments/user/personal::form-basic"; 

Btw. Ich sehe, dass Ihre URL zu einem anderen Endpunkt führt. In diesem Fall sollten Sie es in @{...} Weise in Ihrem th:action Attribut des Formulars verwenden.

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

Die Verwendung von @ {...} erzeugt keine URL, das Aktionsfeld bleibt wie action = "url" –

+0

Ok, es ist notwendig th: action = "@ {$ {url} } "um die richtige URL zu generieren. –

+0

Natürlich, Dollarzeichen wird auch benötigt –