2012-03-25 2 views
1

В одном из сценариев, которые у меня есть, необходимо выполнить удаленную проверку, чтобы убедиться, что поле не вводится повторно.Ручная удаленная проверка в ASP.NET MVC 3

Это может быть сделано с помощью удаленного Validation ASP.NET MVC 3, однако, это работает отлично в форме, которая используется для CREATE запись, не в той форме, которая используется для EDIT записи, или иначе, это всегда даст мне ошибку, что запись уже присутствует.

Итак, что мне нужно для этой формы Редактировать форму отправки столбцов Id/Name для проверки наличия другой записи с тем же именем, другими словами, есть ли у меня какая-либо другая запись, отличная от той, у которой есть ID, такое же «Имя»?

Работа на стороне сервера работает отлично, проблема заключается в том, что jQuery отображает ошибку внутри диалогового окна JQuery UI. Я следовал так же, как и jquery.validate.unobstrusive.js.

На самом View, я бегу следующие функции

 

    $(document).ready(function() { 
     RemoteValidate({ 
      formName: "CultureEditForm", 
      inputName: "Name", 
      inputId: "CultureId", 
      url: "/Culture/CultureEditNameExists", 
      dupTmpl: "dupTmpl" 
     }); 
    }); 
    

The RemoteValidate() следующим образом:

 
RemoteValidate = function (options) {  
    $('#' + options.formName + ' input[name=\"' + options.inputName + '\"]').live('blur', function() { 
     var params = { 
      name: $('#' + options.formName + ' input[name=\"' + options.inputName + '\"]').val(), 
      id: $('#' + options.formName + ' input[id$=\"' + options.inputId + '\"]').val() 
     } 

     $.ajax({ 
      url: options.url, 
      type: "POST", 
      data: JSON.stringify(params, null, 2), 
      contentType: "application/json; charset=utf8", 
      dataType: "json", 
      success: function (response) { 
       if (!response) { 
        _onError(options.formName, options.inputName); 
       } 
       else { 
        _onSuccess(options.formName, options.inputName); 
       } 
      } 
     });   
    }); 

    function _onError(formId, inputElement) { 
     var container = $('#' + formId).find("[data-valmsg-for='" + inputElement + "']"), 
      replace = $.parseJSON(container.attr("data-valmsg-replace")) !== false; 

     container.removeClass("field-validation-valid").addClass("field-validation-error"); 

     if (replace) { 
      container.empty(); 
      $('Name already exists').appendTo(container); 
     } 
    } 

    function _onSuccess(formId, inputElement) { 
     var container = $('#' + formId).find("[data-valmsg-for='" + inputElement + "']"), 
      replace = $.parseJSON(container.attr("data-valmsg-replace")); 

     if (container) { 
      container.addClass("field-validation-valid").removeClass("field-validation-error"); 

      if (replace) { 
       container.empty(); 
      } 
     } 
    } 
} 

Пока диалоговое окно открыто, я продолжаю пытаться значения, и он работает с сообщением об ошибке «show/hide».

Однако, когда я закрываю диалоговое окно, а затем нажимаю на другую запись для редактирования, он снова открывает диалоговое окно с новыми значениями, однако, когда он пытается отправить серверу запрос на проверку, существует ли запись в базе данных, ОТПРАВКА ОТЧЕТА ДАННЫЕ ПРЕДЫДУЩЕЙ ЗАПИСИ, КОТОРЫЕ БЫЛИ ИЗОБРАЖЕНЫ

Я выделил выделенную выше строку, которая подготавливает объект для отправки на сервер.

Любая помощь?

Благодаря

ответ

0

Работа с динамическими представлениями или любое другое содержимое HTML всегда считается особым случаем и чувствительным. Мне пришлось изменить способ доступа к полям данных внутри обработчика событий, чтобы он работал.

Как кажется, jQuery всегда читал старые значения первого HTML-представления, который был загружен. Для того, чтобы сделать его динамичным и читать данные, связанные с видом отображается, я должен был написать следующее:

 
     $('.rm-field').live('blur', function() { 
     if ($(this).next()) { 
      var params = { 
       name: $(this).val(), id: $('input:last-child', $(this).parents('form')).val() 
      } 

      var element = $(this); 
      var container = $(this).next(); 
      var url = element.parents('form').attr('data-rm-url'); 

      $.ajax({ 
       url: url, 
       type: "POST", 
       data: JSON.stringify(params, null, 2), 
       contentType: "application/json; charset=utf8", 
       dataType: "json", 
       success: function (response) { 
        if (!response) { 
         if (container) { 
          container.removeClass("field-validation-valid").addClass("field-validation-error"); 
          container.empty(); 
          $('Name already exists').appendTo(container); 
         } 
        } 
        else { 
         if (container) { 
          container.addClass("field-validation-valid").removeClass("field-validation-error"); 
          container.empty(); 
         } 
        } 
       } 
      }); 
     } 
    }); 

мне пришлось добавить класс .rm-поле для каждого поля ввода, затем прикрепляется к нему в blur event, после этого я смог захватить значение поля ввода.

Мне также нужно было открыть скрытое поле cultureId, но jQuery продолжал обращаться к первому Просмотр HTML, так что это было бесполезно. Вместо этого я использовал родителей() навигационный селектор, чтобы добраться до формы, затем возьмите последний ребенок, который в моем случае является скрытым полем, в котором находится идентификатор редактируемой записи.

После этого простая манипуляция с DOM для добавления/удаления сообщения об ошибке.

HTH, С уважением

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