2016-03-15 118 views
1

我在列表中查看我列表中的對象。我希望能夠使用表格中的按鈕編輯對象。將循環變量從Freemarker模板傳遞到Spring控制器

<#list products as product> 
    <tr> 
     <td>${product.productName}</td> 
     <td>${product.price}</td> 
     <td>${product.quantity}</td> 
     <td> 
      <form name="product" method="post" action="/product/edit"> 
       <input type="submit" name="submit" value="Edit this product"/> 
      </form> 
     </td> 
    </tr> 
</#list> 

目的然後應傳遞給控制器​​方法:

@RequestMapping(value="/edit", method = RequestMethod.POST) 
public ModelAndView edit(@ModelAttribute("product") Product product){ 
    ModelAndView mav = new ModelAndView("product/edit"); 
    mav.addObject("product", product); 
    return mav; 
} 

然而,由edit方法獲得的product爲空。我該如何解決?我試圖使用下面的代碼綁定產品內部的形式,但那也不起作用。

<form name="product" method="post" action="/product/edit"> 
     <@spring.bind "product" /> 
     <input type="hidden" name="${spring.status.expression}" value="${spring.status.value}"/> 
     <input type="submit" name="submit" value="Edit this product"/> 
    </form> 

我想使用POST方法。

回答

1

我想建議一種不同的方法。如果我沒有弄錯,你只是想選擇一個物體供以後編輯 - 你不會真的在這個視圖中編輯它。

如果是這樣,你所要做的就是將你的對象的標識符傳遞給你的控制器,而不是選定的對象本身。

如果沒有,您應該給我們洞的故事,並提供其餘的視圖。

假設我是對的下一個問題是爲什麼你需要使用表單提交。傳遞一個id是最好的鏈接進行 - 無論是作爲參數,或者,如果你遵循REST風格的,作爲URI本身的一部分:

<!-- Link parameter --> 
<#list products as product> 
    <tr> 
     <td>${product.productName}</td> 
     <td>${product.price}</td> 
     <td>${product.quantity}</td> 
     <td> 
      <a href="yourURI?pid=${product.productName}">Edit ${product.productName}</a> 
     </td> 
    </tr> 
</#list> 


<!-- REST-style --> 
... 
      <a href="product/{product.productName}/edit">Edit ${product.productName}</a> 
... 

productName當然不是一個好的ID。如果products是一個列表(意思是,java.util.List)列表的索引是方便的。即使在HashMapSet我會創建一個唯一的ID,而不是使用產品名稱。

既然您可以識別您的對象,請在後面的代碼中選擇它以便以後進行編輯,但不能在視圖中進行編輯。 您會發現如何在控制器中獲取鏈接參數的大量示例。所以,這裏不需要詳細介紹。

然而,如果你堅持使用形式和POST方法再去做這樣的:(下文版本10)

<form method="post" action="/product/edit"> 
    <#list products as product> 
     <tr> 
      <td>${product.productName}</td> 
      <td>${product.price}</td> 
      <td>${product.quantity}</td> 
      <td> 
       <button value="${product.productName}" name="product" type="submit">Edit ${product.productName}</button> 
      </td> 
     </tr> 
    </#list> 
</form> 

請注意,這不會對舊的IE瀏覽器,因爲他們不要返回值,而是返回按鈕標籤中的所有內容。

隱藏的輸入和單個提交按鈕根本沒有幫助,因爲所有輸入被提交,並且使用不同的形式也不是這樣。

+0

謝謝你的回答。您是正確的,該產品只是爲進一步編輯選擇。產品存儲在數據庫中並作爲列表返回。當然,產品有一個ID。我只是想避免通過id從數據庫獲取產品,因爲它已經在列表中,並且沒有真正需要再次調用服務層。 明天我會測試你的解決方案。謝謝。 – RK1

+0

我明白了!我瞭解你的動機。但不幸的是,對象列表必須在某個地方「存活」請求響應圈。這是在會話中還是在數據庫中。渲染你的Freemaker模板後,只是HTML。剩下的就是文字。因此,沒有辦法進行選擇並返回客戶端對象,因爲它們根本就不在那裏。沒有辦法使用服務層,即使是在異步請求中。 – MyBrainHurts

+0

當然,這是有道理的。 「剩下的就是文字」,完美地總結了它。謝謝! – RK1

相關問題