我有一个像这样的jsp表单......第二个选择框中的值,应该根据第一个选择框(国家/地区)中的值加载状态。我正在使用AJAX,JSON,Spring MVC来检索结果。
的index.jsp .....
<form:form name="myform" modelAttribute="search" action="POST">
<form:input path="firstName" class="text" />
<form:input path="lastName" class="text" />
<form:select path="country" id="country">
<form:option value="" label="--Choose A Value--"></form:option>
<form:options items="${countryList}" itemValue="id" itemLabel="name"></form:options>
</form:select>
<form:select path="state" onchange="javascript:itemFocus('submit');" id="state">
<form:option value="" label="--Choose A Value--"></form:option>
<form:options items="${stateList}" itemValue="id" itemLabel="description"></form:options>
</form:select>
<form:checkboxes items="${skillsList}" path="skills" itemLabel="description" itemValue="id" delimiter="<br>" />
<form:checkboxes items="${languagesList}" path="languages" itemLabel="description" itemValue="id" delimiter="<br>" />
</form:form>
...控制器
@RequestMapping(value="stateslist.html")
public @ResponseBody List<State> sectionList(@ModelAttribute("search") SearchForm search, @RequestParam(value="countryId", required=true) String countryId, ModelMap modelMap){
return stateService.getStates(countryId);
}
JQuery part ....
<script type="text/javascript" charset="utf-8">
function getStates(){
$.getJSON(
"stateslist.html",
{countryId: $('#country').val()},
function(data) {
var html = '';
var len = data.length;
for(var i=0; i<len; i++){
html += '<option value="' + data[i].id + '">' + data[i].name + '</option>';
}
$('#state').append(html);
}
);
}
$(document).ready(function() {
$('#country').change(function()
{ getStates();
});
});
</script>
我可以看到调试器将ajax请求提交给Spring控制器,它确实返回一个State对象列表,其中包含id,name等字段...问题是状态选择选项是不改变..似乎是function(data){....}
部分不起作用。有人帮助我,我在这里做错了...
---更新---
我已经删除了回调函数中的所有内容,只是有了... ...
function(data){alert("something");}
即使这不起作用......这意味着呼叫从未到达那个部分......
答案 0 :(得分:9)
我有相同的代码,其中city(cityId)值根据country(countryId)选择进行更改。它完美无缺:
$("select#countryId").change(function(){
$.getJSON("getCityList.do",{countryCode: $(this).val()}, function(j){
var options = '';
for (var i = 0; i < j.length; i++) {
options += '<option value="' + j[i].id + '">' + j[i].name + '</option>';
}
$("select#cityId").html(options);
});
});
所以我认为你只需要添加“select”前缀。
答案 1 :(得分:0)
我正在更新您的控制器方法以避免406 Not Acceptable
错误:
@RequestMapping(value="stateslist.json")
@ResponseStatus(HttpStatus.OK)
public @ResponseBody List<State> sectionList(@ModelAttribute("search") SearchForm search, @RequestParam(value="countryId", required=true) String countryId, ModelMap modelMap){
return stateService.getStates(countryId);
}
和你的JQuery部分:
<script type="text/javascript" charset="utf-8">
function getStates(){
$.getJSON(
"stateslist.json",
{countryId: $('select#country').val()},
function(data) {
var html = '';
var len = data.length;
for(var i=0; i<len; i++){
html += '<option value="' + data[i].id + '">' + data[i].name + '</option>';
}
$('select#state').append(html);
}
);
}
$(document).ready(function() {
$('#country').change(function()
{ getStates();
});
});
</script>
答案 2 :(得分:0)
将以下依赖项添加到pom.xml
:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.5.0</version>
</dependency>
最后在控制器类中添加@ResponseBody
注释。