Отправка формы jQuery с сообщением об успехе и ошибке

Я отправляю и проверяю форму с помощью jQuery, и со стороны сервера я получаю ответ в формате JSON.

Я показываю сообщение в диалоговом окне jQuery, но не могу показать сообщение с сервера ....

Мой подход:

<script type="text/javascript">
//<![CDATA[
    $.validator.setDefaults({
    submitHandler: function() { 
        var spogName         = $("input#spogname").val();
        var spogDis            = $("input#spogdescription").val();
        var dataString         ='&spogName='+ spogName +'&spogDescription=' + spogDis;
        $.ajax({
            url: "/cpsb/spogMaster.do?method=addSpog",    
            type: "POST",        
            data: dataString,        
            cache: false,
            success: function() {  
                $("#dialog-message").dialog({
                    resizable:false,
                    height:180,
                    modal: true,
                    buttons: {
                        Ok: function() {
                            $(this).dialog('close');
                        }
                    }
                });

               },   

           error: function() {
           }                    
        });
    },
    highlight: function(input) {
        $(input).addClass("ui-state-highlight");
    },
    unhighlight: function(input) {
        $(input).removeClass("ui-state-highlight");
    }
});

$(document).ready(function() {
    navMenu();
    $("#spogForm").validate({
        rules: {
            spogname:{
            required: true
            }
        },
        messages: {
            spogname: "Please enter the Spog Name"
        }
    });

    $(":submit").button();
});
//]]>
</script>

Моя разметка:

<div id="dialog-message" title="Spog Message" style="display:none;">
    <p>
        <span class="ui-icon ui-icon-circle-check" style="float:left; margin:0 7px 50px 0;"></span>
         Spog added successfully!
    </p>
</div>
<div id="header"><jsp:include  page="../menu_v1.jsp"/></div>
<div id="mainContent">
<div id="spog_form">
  <form class="cmxform" id="spogForm" method="post" action="/cpsb/spogMaster.do?method=addSpog">
    <fieldset class="ui-widget ui-widget-content ui-corner-all">
        <legend class="ui-widget ui-widget-header ui-corner-all">ADD SPOG</legend>
        <p>
            <label for="spogname">Spog Name (required)</label>
            <input id="spogname" name="spogName" class="required ui-widget-content" minlength="2" />
        </p>
        <p>
            <label for="spogdescription">Spog Description </label>
            <input id="spogdescription" name="spogDescription" class="spogD ui-widget-content" />
        </p>

        <p>
            <button class="submit" type="submit">Submit</button>
        </p>
    </fieldset>
</form>
</div>
</div>
</body>

json строка, которую я получаю, если в базе данных существует spog:

{"messageId":"errorMessage","message":"spog found with Name 10000 Description nuts"}

Обновление 1:

<script type="text/javascript">
//<![CDATA[
    $.validator.setDefaults({
    submitHandler: function() { 
        var spogName         = $("input#spogname").val();
        var spogDis            = $("input#spogdescription").val();
        $.ajax({
            url: "/cpsb/spogMaster.do?method=addSpog",    
            type: "POST",    
            datatype:'json',    
            data: {
                method:"addSpog",
                spogName:spogName,
                spogDescription:spogDis
            },    
            cache: false,
            success: function(data) {
              if ( data.messageId === 'errorMessage' ) {
                // server responded with an error, show the error placeholder
                // fill in the error message, and spawn the dialog
                $("#dialog-message")
                  .find('.success').hide().end()
                  .find('.error').show()
                    .find('.message').text( data.message ).end()
                    .end()
                  .dialog({
                    resizable:false,
                    height:180,
                    modal: true,
                    buttons: {
                      Ok: function() {
                        $(this).dialog('close');
                      }
                    }
                  });
              } else {
                // server liked it, show the success placeholder and spawn the dialog
                $("#dialog-message")
                  .find('.error').hide().end()
                  .find('.success').show().end()
                  .dialog({
                    resizable:false,
                    height:180,
                    modal: true,
                    buttons: {
                      Ok: function() {
                        $(this).dialog('close');
                      }
                    }
                  });
              }
            }
        });
    },
    highlight: function(input) {
        $(input).addClass("ui-state-highlight");
    },
    unhighlight: function(input) {
        $(input).removeClass("ui-state-highlight");
    }
});

$(document).ready(function() {
    navMenu();
    $("#spogForm").validate({
        rules: {
            spogname:{
            required: true
            }
        },
        messages: {
            spogname: "Please enter the Spog Name"
        }
    });


    $(":submit").button();
});
//]]>
</script>

Разметка:

<div id="dialog-message" title="Spog Message" style="display:none;">
    <p class="success">
        <span class="ui-icon ui-icon-circle-check" style="float:left; margin:0 7px 50px 0;"></span>
         Spog added successfully!
    </p>
    <p class="error">
        An error occurred while adding spog: 
        <span class="message"></span>
    </p>
</div>

person paul    schedule 15.09.2010    source источник
comment
какой код на стороне вашего сервера?   -  person Haim Evgi    schedule 15.09.2010
comment
Одна явная ошибка в вашем коде: вы используете datatype, как в jqGrid. jQuery.ajax параметр dataType. Кроме того, включите как минимум alert("error!") в дескриптор error.   -  person Oleg    schedule 17.09.2010
comment
Я бы порекомендовал вернуть код статуса HTTP в случае ошибки (см. apl.jhu.edu/~hall/java/Servlet-Tutorial/). HttpServletResponse имеет методы setStatus или sendError (см. http://www.java2s.com/Code/JavaAPI/javax.servlet.http/HttpServletResponse.htm), который вы можете использовать. Например, HttpServletResponse.SC_BAD_REQUEST будет лучше как 200 (ОК). Вы также должны попытаться вызвать исключение в своем сервлете и изучить, как данные поступают в error дескриптор ajax. Может быть, вам следует позвонить JSON.Parse, чтобы расшифровать ответ об ошибке.   -  person Oleg    schedule 17.09.2010
comment
@ Oleg .. проблема в том, что он не может получить доступ к блоку if и перейти непосредственно к блоку else и ... и в документации $ .ajax я могу использовать тип данных: json ... проблема связана с доступом к ответу json с сервера. ..   -  person paul    schedule 17.09.2010


Ответы (2)


Как отмечает @Sam, вам нужно будет настроить обратный вызов успеха, а также немного изменить свой HTML.

<div id="dialog-message" title="Spog Message" style="display:none;">
    <p class="success">
        <span class="ui-icon ui-icon-circle-check" style="float:left; margin:0 7px 50px 0;"></span>
         Spog added successfully!
    </p>
    <p class="error">
        An error occurred while adding spog: 
        <span class="message">placeholder</span>
    </p>
</div>

Затем изменение JS ...

success: function(data) {
  if ( data.messageId && data.messageId === 'errorMessage' ) {
    // server responded with an error, show the error placeholder
    // fill in the error message, and spawn the dialog
    $("#dialog-message")
      .find('.success').hide().end()
      .find('.error').show()
        .find('.message').text( data.message ).end()
        .end()
      .dialog({
        resizable:false,
        height:180,
        modal: true,
        buttons: {
          Ok: function() {
            $(this).dialog('close');
          }
        }
      });
  } else {
    // server liked it, show the success placeholder and spawn the dialog
    $("#dialog-message")
      .find('.error').hide().end()
      .find('.success').show().end()
      .dialog({
        resizable:false,
        height:180,
        modal: true,
        buttons: {
          Ok: function() {
            $(this).dialog('close');
          }
        }
      });
  }
},
person BBonifield    schedule 15.09.2010
comment
хорошо, я попробовал ваше предложение, но все же он показывает мне, что spog успешно добавлен, вместо того, чтобы показывать ответ сервера {messageId: errorMessage, message: spog found with Name 10000 Description toys} - person paul; 15.09.2010
comment
Правильно ли вы изменили success: function () {на success: function (data) {? Предполагая, что ваш сервер предоставляет правильный заголовок типа содержимого application / json и записывает данные, он должен работать правильно. - person BBonifield; 15.09.2010
comment
Да, я перешел на функцию (данные). Пожалуйста, проверьте мои обновленные js, как вы предложили выше. - person paul; 16.09.2010
comment
Вы проверили, что данные на самом деле являются правильным возвращаемым объектом JSON с помощью console.log ()? - person BBonifield; 16.09.2010
comment
да, я проверил строку JSON, и это {messageId: errorMessage, message: spog обнаружен с именем 10000 Описание toys} - person paul; 16.09.2010

Добавьте выше "успех": datatype: "json",

Затем измените успех на что-то вроде:

success: function(data) {  
    $("#dialog-message").append('<p>'+data.message+'</p>').dialog({
        resizable:false,
        height:180,
        modal: true,
        buttons: {
            Ok: function() {
                $(this).dialog('close');
            }
        }
    });
},

В основном вам нужно;
a) Сообщите своему коду, что ваш сервер будет возвращать JSON (и поэтому он должен его оценивать)
b) Сделайте что-нибудь с этот JSON - например, вытащите сообщение и добавьте его в свое диалоговое окно

Пожалуйста, поймите, что приведенный выше код является всего лишь предложением, и я его не тестировал!

person Sam    schedule 15.09.2010
comment
Фактически был несчастный случай. Я пытался отменить голосование "за", но вместо этого оно проголосовало против. - person BBonifield; 15.09.2010
comment
@Sam Я проголосовал за вас +1 ... Я использую подход @BBonified и добавляю этот тип данных json, но все еще могу получать только одно сообщение, неспособное получить другое сообщение, когда spog уже существует в базе данных - person paul; 16.09.2010
comment
@BBonifield - Я отредактировал свой пост. @paul - Можем ли мы увидеть демонстрационную страницу, чтобы мы могли отладить проблему? Сейчас мы все работаем вслепую! - person Sam; 16.09.2010
comment
@Sam Мое приложение все еще находится в стадии разработки и не имеет общедоступного URL .... Я попытался отладить его и увидел, что вместо перехода к оператору if оно напрямую переходит в блок else и показывает мне успешное сообщение вместо отображается сообщение об ошибке .... поэтому оно не выполняется if (data.messageId === 'errorMessage') - person paul; 16.09.2010