当我试图解决这个问题时,请光临我。
假设您使用Spring MVC的SimpleFormController版本2.5.6为水果供应商编写了一个网页。在此页面上,供应商可以执行简单的操作,例如更改其姓名或地址。他们还可以根据填充当前库存选择的下拉列表更改库存。
当此下拉列表选择更改时,整个表单将更改为与所选内容的库存相匹配。因此,一种选择可能有香蕉和梨,另一种可能有甜瓜,蓝莓和葡萄柚。 Image to demonstrate what I am talking about. http://i47.tinypic.com/15gwbow.png
每个库存选择内部都是一个需要传播回数据库的输入字段,为了这个例子,我们假设用户输入了水果数。
在数据库中建模的方式是每个股票名称存储在一个表格中,该表格与每个股票的内容具有一对多的关系,这将是本例中的水果类型。然后,水果的类型与供应商选择的数量具有一对多的关系。每个库存中的库存名称和水果类型都存储在数据库中,并且用户无法更改,连接的水果数量表可编辑。
我的问题是,您如何在Spring MVC中对上述表单进行建模?
我尝试重写isFormChangeRequest和onFormChange以促进表单更改,但我想我可能会误解这些方法的意图。当我下次页面发布时更改我的后备命令对象时,它会尝试将请求绑定到表单中,如果您调整Stock数组的大小(例如从3到2,它将尝试绑定到第3个),这会中断值,即使它是空的。)
任何人都可以帮我解决这个问题吗?
答案 0 :(得分:0)
如果您有不同数量的不同股票,您可以为具有不同支持模型的每个股票使用不同的处理程序映射:
@RequestMapping(PARAMS = “股票=例1”) ModelAndView handleExample1(@ModelAttribute(“stock”)ApplesOrangesPears stockObject)
@RequestMapping(PARAMS = “股票=示例2”) ModelAndView handleExample2(@ModelAttribute(“stock”)BananasPotatos stockObject)
但我想情况并非如此,有很多不同的股票类型,它们是动态的。在这种情况下,您可以注册自定义属性编辑器(@InitBinder),并动态确定清单的支持对象的实际类型,然后验证,并显式转换为或从中转换。
答案 1 :(得分:0)
我最终做的是在下拉列表中的选择发生更改时触发JavaScript事件。此JavaScript(如下所示)根据下拉列表的选择生成URL,并使用location.replace转到新URL,这会导致控制器生成新表单。
使用此方法覆盖isFormChangeRequest和onFormChange,可以避免因遗留数据而导致的绑定错误。
function changeUrl(selectionValue) {
var param = getParams();
param["dropdownselection"] = selectionValue;
window.location.replace(getBaseUrl() + buildQueryString(param));
}
//taken from http://javascript.about.com/library/blqs1.htm
function getParams() {
var qsParm = new Array();
var query = window.location.search.substring(1);
var parms = query.split('&');
for (var i = 0; i < parms.length; i++) {
var pos = parms[i].indexOf('=');
if (pos > 0) {
var key = parms[i].substring(0,pos);
var val = parms[i].substring(pos+1);
qsParm[key] = val;
}
}
return qsParm;
}
function getBaseUrl() {
var url = document.location.toString();
if (url.indexOf('?') != -1) {
url = url.substring(0, url.indexOf('?'));
}
return url;
}
function buildQueryString(param) {
var queryString = "?";
for (var key in param) {
queryString += key + "=" + param[key] + "&";
}
//remove last "&"
return queryString.substring(0,queryString.length - 1);
}