使用DTO绑定多个动态创建的字段的相同属性名称
我有2个下拉菜单A
和B
-
A
是正常下拉列表 -
B
是多选下拉列表
A
包含学校中的课程列表, B
包含学校中的部门
还有一个用于动态创建这两个下拉菜单的按钮(可能有n个下拉菜单)
我想同时将n个下拉值保存到我的数据库,但问题是我所有动态创建的字段属性名称都与原始的两个下拉列表相同,这样我就可以获得输入到后端的最后一个下拉列表的值。 我可以使用js动态更改属性名称,但我无法在dto中动态创建变量。
我希望我的n个下拉值绑定到相同的DTO变量作为列表或类似的东西,有没有其他方法来实现这一点? 我研究并使用apache commons collections4
和autopopulatingList
但我没有找到任何适当的例子
我的DTO课程
public class TestDto { private Long fkcl; private String[] fkdiv; public Long getFkcl() { return fkcl; } public void setFkcl(Long fkcl) { this.fkcl = fkcl; } public String[] getFkdiv() { return fkdiv; } public void setFkdiv(String[] fkdiv) { this.fkdiv = fkdiv; }
ClassDes
public class ClassDes { public List list = new ArrayList(); public List getList() { return list; } public void setList(List list) { this.list = list; } }
调节器
@RequestMapping(value = "/testing") public ModelAndView ff(Model model) { ClassDes testprof = new ClassDes(); List bslist = serv.findAllclass(); model.addAttribute("blah", bslist); List std = stdServ.findAll(); model.addAttribute("std", std); return new ModelAndView("test" , "testprof", testprof); } @RequestMapping(value = "/save", method = RequestMethod.POST) public ModelAndView save(@ModelAttribute ClassDes testprof) { System.out.println(BasicGson.toGson(testprof)); return new ModelAndView("redirect:/testing", "testprof", testprof); }
但我的列表返回空{"list":[]}
但在我的ajax方法中,它显示
{"listed[].fkcl":"3","listed[].fkdiv":["1","2","3","4","5"]}
你可以在js中更改你的submitform函数
$('#submitForm').submit(function(e) { var frm = $('#submitForm'); e.preventDefault(); var data = {}; var dt=[]; var newdt = {}; var Form = this; $.each(this, function(i, v) { var input = $(v); if(data.hasOwnProperty("fkcl")) //mapped all dropdown values to fkcl and fkdiv inorder to use `TestDto` variables { if(data.hasOwnProperty("fkdiv")) { dt.push(data); data={}; } } data[input.attr("name")] = input.val(); delete data["undefined"]; }); newdt['list']=dt; alert(JSON.stringify(newdt)); $.ajax({ async : false, global : false, contentType : 'application/json; charset=utf-8', type : 'post', url : frm.attr('action'), data : JSON.stringify(newdt), success : function(callback) { window.location.reload(); }, error : function() { $(this).html("Error!"); } });
@Controller
@RequestMapping(value = "/save", method = RequestMethod.POST) public void save(@RequestBody ClassDes testprof) { for (TestDto t : testprof.getList()) { serv.save(t); } return new "redirect:/testing"; }
当您在表单中动态创建输入节时,我认为最好使用javascript将所有输入组装到JSON对象中。
然后,您可以将JSON对象作为单个表单参数发送到服务器,您可以按照自己的方式处理它。 这将简化参数处理过程,因为您只需使用一个。