繁体   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