2012-03-25 74 views
1

在其中一個場景中,需要進行遠程驗證以確保不再輸入字段。ASP.NET MVC中的手動遠程驗證3

這可以使用ASP.NET MVC 3遠程驗證來完成,然而,這完美的作品中用來CREATE記錄的形式,而不是用來編輯記錄的形式,否則,它總會給我一個記錄已經存在的錯誤。

所以我需要這個編輯表單是發送ID /名稱列來驗證另一個具有相同名稱的記錄的存在,換句話說,我有任何其他記錄'以外的具有ID'有相同的「名稱」?

服務器端邏輯工作完美,問題在於jQuery在顯示jQuery UI對話框內的錯誤。我遵循jquery.validate.unobstrusive.js使用的相同方式。

在視圖本身,我運行了以下內容:

 

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

的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(); 
      } 
     } 
    } 
} 

只要對話窗口打開時,我一直在努力值,並且它能夠「顯示/隱藏」錯誤消息。

但是,當我關閉對話框,然後單擊另一條記錄進行編輯時,它會以新值再次打開對話框,但是當它試圖向服務器發送請求以檢查數據庫中是否存在記錄時,它的發送先前記錄的數據已被編輯

我已經做了上面的行,以準備發送到服務器的對象的行。

任何幫助?

感謝

回答

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的場添加到每個輸入字段,然後連接到它的模糊事件,之後我能夠獲取輸入字段的值。

我還需要訪問隱藏字段cultureId但jQuery保持訪問第一個查看HTML,所以這是不好的。我做的是,我用父母()導航選擇器,以達到形式然後抓住最後一個孩子,在我的情況下,隱藏字段持有正在編輯的記錄的ID。

然後,簡單的DOM操作添加/刪除錯誤消息。

HTH, Regards