簡體   English   中英

Spring MVC - 如何在部分綁定到表單時不丟失字段值

[英]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-b​​arking-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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM