2017-01-05 8 views
1

私は、リゾルバBeanを表示するために、タイムリーフフラグメントの名前を返すSpring MVCコントローラを持っています。問題は、このフラグメントがurlをパラメータとして必要とすることです。ここで私は断片を入れます:Thymeleaf Ajaxフラグメントへのパラメータの受け渡し方法

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

:私は次のエラー得る上記例えば

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

全てにおいて

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

をIエラー

を得ます
+0

エラーのテキストを追加できますか? –

+0

申し訳ありませんけん、私は上記に加えましたが、例外はあります。 –

答えて

3

コントローラからThymeleafフラグメントにパラメータを渡す方法は2通りあります。最初は通常の春の方法です - モデルをスローする:

@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

ありがとうKen、非常に良い説明 –

1

あなたがしなければならないのは、urlパラメータを(以前のように)モデル属性として含めることだけです。あなたのフラグメント名を決して通知する必要はありません。パラメータを持たないので、フラグメント名を返すだけです。

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

btw。あなたのURLが他のいくつかのエンドポイントにつながっていることがわかりました。その場合は、フォームのth:action属性で@{...}の方法で使用する必要があります。

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

@ {...}を使用してもURLは生成されません。アクションフィールドはaction = "url"のままです。 –

+0

よろしくお願いします。action = "@ {$ {url} } "正しいURLを生成する。 –

+0

もちろん、ドル記号も必要です –

関連する問題