Проверка значений перед отправкой с помощью document.form.action

#javascript #jquery #spring-mvc #pdf #submit

#javascript #jquery #spring-mvc #PDF #Отправить

Вопрос:

В моем веб-приложении у меня есть форма с двумя <select> . Один представляет месяц, а другой — год.

 <form id="reportform" target="_blank">
    <table cellpadding="3" cellspacing="14">
    <thead>
        <th class="report" colspan="2"><spring:message code="label.month"/></th>                        
        <th class="report" colspan="2"><spring:message code="label.year" /></th>
        <th colspan="2"></th>
    </thead>
    <tbody>
    <tr>
        <td>
            <input name="centerId" value="${center.centerId}" type="hidden">
        </td>
        <td class="date">
            <select class="select-input-month-report" id="select-input-month" name="month">
                <option selected="selected" value="0"><spring:message code="label.select" /></option>
                <option value="1"><spring:message code="label.january" /></option>
                <option value="2"><spring:message code="label.february" /></option>
                <option value="3"><spring:message code="label.march" /></option>
                <option value="4"><spring:message code="label.april" /></option>
                <option value="5"><spring:message code="label.may" /></option>
                <option value="6"><spring:message code="label.june" /></option>
                <option value="7"><spring:message code="label.july" /></option>
                <option value="8"><spring:message code="label.august" /></option>
                <option value="9"><spring:message code="label.september" /></option>
                <option value="10"><spring:message code="label.october" /></option>
                <option value="11"><spring:message code="label.november" /></option>
                <option value="12"><spring:message code="label.december" /></option>
            </select>
        </td>
        <td></td>
        <td class="date">
            <select class="select-input-year-report" id="select-input-year" name="year">
                <option value="0" selected="selected"><spring:message code="label.select" /></option>
                <option value="2013">2013</option>
                <option value="2014">2014</option>
            </select>
        </td>
        <td align="right">
            <input id="go" class="go" type="submit" value="Report">
        </td>
    </tr>
    </tbody>
    </table>
</form>
 

На стороне сервера PDF генерируется (с использованием iTextPdf ) в соответствии с месяцем и годом, выбранным в пользовательском интерфейсе.

Когда месяц и год указаны правильно, PDF генерируется правильно, но когда пользователь не выбирает правильные месяц и год (один из них равен нулю), я получаю сообщение об ошибке в своем серверной части.

Я хотел бы проверить, что месяц или год отличаются от 0 с помощью кода javascript, и минимизировать изменения в моем @Controller . Но я не могу проверить значения месяца и года и вызвать серверную службу с помощью document.reportform.action .

 @Controller
public class ReportController {

    @RequestMapping(value="/report.pdf", method=RequestMethod.POST)
    public ModelAndView getPdfReport(@ModelAttribute ReportRequest request) throws DAOException {        

        ...
        return mav;
    }
}
 

Я вызываю сервис следующим образом:

 $(function(){
    $('form').submit(function(){
        var zeros = checkDate();
        if(zeros == '0'){
            document.reportform.action = "/report.pdf";
        }
    });
});

function checkDate(){
    var zeros = 0;
    if(document.getElementById("select-input-month").value == 0){
        zeros  ;
    }
    if(document.getElementById("select-input-year").value == 0){
        zeros  ;
    }
    return zeros;
}
 

Помощь будет оценена.

Обновление: я получаю ошибку Javascript: document.reportform.action = "/report.pdf" not defined.

Комментарии:

1. Это не очень хорошая идея с выполнением проверок только с помощью javascript. Вы также должны делать это в контроллере.

2. Вы уже используете jQuery, тогда почему бы вам не использовать $("#select-input-month").val() ?

3. На самом деле вы не говорите, что с этим не так. Можете ли вы объяснить, что он делает или не делает?

4. @DhavalMarthak вы правы, спасибо.

Ответ №1:

 <form id="reportform" target="_blank" method="post">

    $(function(){
        $('form').submit(function(e){
            var zeros = checkDate();
            if(zeros == '0'){
                $(this).attr("action","/report.pdf");
            }
            else{
                e.preventDefault();
                alert('Select month and year');
            }
        });
    });
 

Скрипка: http://jsfiddle.net/URfkN/1 /

 @Controller
public class ReportController {

    @RequestMapping(value="/report.pdf", method=RequestMethod.POST)
    public ModelAndView getPdfReport(@ModelAttribute ReportRequest request, HttpServletRequest httpRequest) throws DAOException {        

        String month = httpRequest.getParameter("month");
        String year= httpRequest.getParameter("year");
        ....
        return mav;
    }
}
 

Комментарии:

1. Выглядит близко, но я получаю сообщение об ошибке ‘GET’ метод не поддерживается. Я определил как POST, потому что я отправляю данные в серверную часть. Есть какие-нибудь идеи?

2. <идентификатор формы =»форма отчета» цель =»_blank» метод =»post»>

3. Верно, я забыл изменить метод. Но теперь у меня возникает проблема при создании объекта ReportRequest. Предполагается, что параметры отправляются в ответ на тело, а не в URL, верно?

4. Я не вижу никакого атрибута модели в вашем html. Возможно, вы можете использовать сам HTTP-запрос.

5. Нет необходимости это делать. Когда я отправляю форму, тело запроса имеет 3 параметра. SpringMVC напрямую создал мой объект ReportRequest ( @ModelAttribute ReportRequest request ). Я проверяю ваше решение, которое может работать, но не настолько умно, чем использование всей мощности SpringMVC.

Ответ №2:

Используя jQuery, это довольно просто:

     $(function(){
        $('form').submit(function(e){
        e.preventDefault();
        if($("#select-input-month").val()=='0' || $("#select-input-year").val()=='0')
        {
            document.reportform.action = "/report.pdf";
        }
        });
    });