2014-09-17 5 views
0

Я динамически загружал выпадающий список с вызовом ajax, но проблема в том, что я не могу получить к нему доступ в controller. динамически загруженный выпадающий список найден как null в контроллере!Динамическое падение вниз, загруженное с помощью ajax, найдено как null в контроллере mvc весны

JSP-код:

<body> 
    <c:url var="updateUrl" value="${actionPath}"/> 
    <form:form method="post" action="${updateUrl}" commandName="complaintDetail"> 
     <table> 
      <tr> 
       <td><form:label path="complaintCategory">Category</form:label></td> 
       <td>       
        <form:select path="complaintCategory"> 
         <form:option value="NONE" label="--- Select ---" /> 
         <form:options items="${categoryList}"/> 
        </form:select> 
       </td> 
      </tr> 
      <tr> 
       <td><form:label path="complaintReasonDetail">Reason</form:label></td> 
       <td>       
        <form:select path="complaintReasonDetail"> 
         <form:option value="NONE" label="--- Select ---" /> 
         <form:options items="${reasonList}" /> 
        </form:select> 
       </td> 
      </tr> 
      <tr> 
       <td colspan="2"> 
        <input type="submit" value="${submitString}"> 
       </td> 
      </tr> 
     </table> 
    </form:form> 
</body> 

, ИС Код:

$('#complaintCategory').change(
function(){ 
    var findReasonsURL = '/Vela-web-client/complaint/getReason/' + $(this).val() + '/GENERAL.htm'; 
    //alert($(this).val()); 
    $.getJSON(findReasonsURL, {}, 
    function(data) { 
     var html = '<option value="">--- Select ---</option>'; 
     var len = data.length; 
     $.each(data, function(i, obj){ 
      html += '<option value="' + obj.idNr + '">' + obj.complaintReasonSt + '</option>'; 
     }); 

     $('#complaintReasonDetail').html(html); 

    }); 
}); 

Для этого Ajax вызова, соответствующий код контроллера:

@RequestMapping(value = "/complaint/getReason/{category}/{rType}", method = RequestMethod.GET) 
public @ResponseBody 
List<ComplaintReasonDetail> getReason(
     @PathVariable(value = "category") String category, 
     @PathVariable(value = "rType") String rType) 
{ 
    List<ComplaintReasonDetail> complaintReasonDetails; 

    ComplaintCategory complaintCategory = ComplaintCategory.valueOf(category); 
    ReasonType reasonType = ReasonType.valueOf(rType); 
    try 
    { 
     complaintReasonDetails = ComplaintReasonHandler.getComplaintReasonAdvanceSearchResult("", false, complaintCategory, true, reasonType, true, BigInteger.ONE); 
     System.out.println("reason list count = " + complaintReasonDetails.size()); 
     return complaintReasonDetails; 
    } 
} 

До этого все работает отлично!

Проблема возникает, когда я отправляю форму. Я получаю complaintReasonDetail как null в коде контроллера.

Controller Код:

@RequestMapping(value = "/complaint/doadd/addnew", method = RequestMethod.POST) 
public String addCompliant(@RequestBody @ModelAttribute("complaintDetail") ComplaintDetail complaintDetail, BindingResult result, Model model) 
{ 
    System.out.println("category = "+complaintDetail.getComplaintCategory()); // OK 
    System.out.println("reason = "+complaintDetail.getComplaintReasonDetail()); // print null ??? 
} 

Это немного длинный вопрос, но чтобы было понятно, я думаю, что это необходимо.

Итак, что мне не хватает на самом деле?

+0

проверить браузер просмотреть исходный код html generated for complaintsReasonDetail select box? а также первое значение параметра пустое не задано в jquery. – Rembo

+0

@Rembo: да, он сгенерирован, и я вижу его в разделе 'form-data', когда форма отправляется, и значение передается (например, 2). Но я думаю, что это значение не сопоставляется с 'complaintsReasonDetail' или как преобразовать его в этот объект. – sarwar026

+1

- это примитивный/обертковый тип 'requestReasonDetail'? или пользовательский, если он определен пользователем, вам нужен конвертер. посмотрите [answer] (http://stackoverflow.com/a/921725/1066779) и [docs] (http://docs.spring.io/spring-framework/docs/3.2.x/spring-framework- reference/html/validation.html) – Rembo

ответ

0

Вы можете позвонить Аякса от выбора с OnChange события, как код ниже:

function onChangeAjaxMain() 
     { 
      var name = $('#state').val(); 

      $.ajax({ 
       type: "POST", 
       url : 'mainAjax', 
       data: ({ 
        nameOfCategory: name 
       }), 
       success : function(data) { 
        $('#city').html(data); 

       } 
      }); 
     } 

в Jsp форме использования: формат весна:

<form:select name="state" id="state" onclick="onChangeAjaxMain()" path="state"> 
    <form:option value="1">blah</form:option> 
    <form:option value="2">blah</form:option> 
</form:select> 
    <br> 
    <form:select id="city" path="city"> 
     <form:option value="NONE">City</form:option> 
    </form:select> 

, наконец, в контроллере:

@RequestMapping(value = "/mainAjax", method = RequestMethod.POST) 
    public @ResponseBody 
    String mainAjax(@RequestParam("state") String state){ 

     String cities= "<option value=\"\">City</option>"; 
     ArrayList<City> citySet = /*fill list respect to state*/ 

     for(City city : citySet){ 

      cities+= "<option value=\""+city.getName+"\">"+city.getName+"</option>"; 
     } 
     cities+= "</option>"; 
     return cities; 

В maven добавьте: jackson-core и jackson-databind. Я использую версию 2.6.3, а также добавляю jackson-mapper-asl с версией 1.5.3

Надеюсь, это будет полезно для вас!

Смежные вопросы