[英]Spring MVC - how not to lose field values when binding to a form partially
我想為bean X創建一個更新表單。這個bean可以說它有字段A,B,C,D。在我的表單中,我想只更新字段A,B並讓C和D不變。 有沒有辦法將bean X綁定到只有字段A和B的更新表單,這樣當我提交表單時C和D將不會被更改?
我知道我可以為C和D添加隱藏字段但是如果這些不是原始字段,它們是其他bean或集合。
我知道另一個解決方案是創建一個只有字段A和B的XUpdateBean,並在表單提交后將XUpdateBean中的字段復制到我的X bean。
在Spring 3 MVC中有更好的更新方式嗎?
你可以擁有一個只包含你需要的字段的命令-Object / form-barking-Bean。
在控制器中,您必須加載bean X,並且需要使用commandObject中的字段更新其字段。
也許您還可以想到沒有為commandObject添加額外的類,而是使用類BeanX。 但是當然你需要兩個BeanX實例,一個用於commandObject,一個用於bean x。
在我看來,正確的方法,特別是在處理樂觀並發控制(@Version)時,暫時將模型屬性存儲在會話中。
@Controller
@SessionAttributes("x")
public class MyController {
@Autowired
private XRepository xRepository;
@InitBinder
void initBinder(WebDataBinder binder) {
binder.setDisallowedFields("id", "c", "d");
}
@RequestMapping("/x/{id}")
String myForm(@PathVariable("id") long id, Model model) {
X x = xRepository.findOne(id);
model.addAttribute("x", x);
return "x-edit";
}
@RequestMapping(value="/x/{id}", method= RequestMethod.POST)
String save(@PathVariable("id") long id, @ModelAttribute X x, SessionStatus sessionStatus) {
xRepository.save(x);
sessionStatus.setComplete();
return "x-edit";
}
}
對不起,我不知道SpringMVC,所以我的回答可能是錯的。
使用另一個名為Stripes的綁定框架,我們通常在綁定之前“保濕”數據。 這意味着您首先從db加載bean,然后才將A和B值綁定到它! 但它仍然具有C和D原始值,因為bean來自DB(通常是JPA實體)。 因此,您不需要隱藏的C和D字段!
SpringMVC似乎可能: Spring MVC 3.0:我如何綁定到持久對象
請注意,您也可以像實際那樣加載綁定到“非DB bean”(因此,如果您不使用隱藏字段,那么您將使C和D字段為空)。 然后你可以簡單地從DB加載你想要修改的bean,並在你想要的字段的binded bean和db bean之間進行合並(這里,你只會合並A和B,以便C和DB bean中的D字段不會被修改)
你可以在這里找到一些關於數據綁定的有趣內容。 對於我來說,在一些棘手的情況下,直接綁定到DB對象可能很危險: 如何有效地使用綁定框架
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.