2012-04-15 112 views
14

我有以下型號:多個字段驗證

public class Customer 
{ 
    public string FirstName {get;set;} 

    public string LastName {get; set;} 

    [Remote("CardExisting", "Validation", AdditionalFields="FirstName,LastName") 
    public string CardNumber {get; set;} 
} 

CardExisting行動將檢查是否有對cardNumber對名字和姓氏的結合現有的記錄。

如果用戶首先輸入卡號,然後輸入他的名字,我不能驗證他,所以當他返回並輸入他的名字時,我需要再次遠程驗證,如果焦點已經從cardnumber丟失,我該怎麼做?屬性?

回答

3

我得到這個工作的方式是通過添加一些JavaScript。

$("#FirstName").change(function() { 
     $('#CardNumber').removeData('previousValue'); 
     $('#CardNumber').valid(); 
    }); 

因此當第一個名稱更改你清楚卡號和以前的任何值重新驗證卡號。

20

擴展Jaluka的答案,我寫了這個幫助器方法,它找到每個具有「附加字段」的每個遠程驗證元素,然後在每次這些字段之一發生更改時對所述元素進行驗證。

// I hate naming things 
function initializeRemotelyValidatingElementsWithAdditionalFields($form) { 
    var remotelyValidatingElements = $form.find("[data-val-remote]"); 

    $.each(remotelyValidatingElements, function (i, element) { 
     var $element = $(element); 

     var additionalFields = $element.attr("data-val-remote-additionalfields"); 

     if (additionalFields.length == 0) return; 

     var rawFieldNames = additionalFields.split(","); 

     var fieldNames = $.map(rawFieldNames, function (fieldName) { return fieldName.replace("*.", ""); }); 

     $.each(fieldNames, function (i, fieldName) { 
      $form.find("#" + fieldName).change(function() { 
       // force re-validation to occur 
       $element.removeData("previousValue"); 
       $element.valid(); 
      }); 
     }); 
    }); 
} 

調用函數像這樣:

$(document).ready(function() { 
    initializeRemotelyValidatingElementsWithAdditionalFields($("#myFormId")); 
}); 
+1

W00t !!!兩天前你回答了這個問題,我剛纔需要它......你的代碼工作起來非常棒! :)在我的情況下,我有兩個必須一起工作的下拉菜單,也就是說,其中一個是另一個的附加字段。美麗的解決方案應該是默認的恕我直言。 :) – 2013-07-22 05:39:55

+0

hehehe我也不喜歡命名的東西......但考慮到我們職業的本質,它本質上每天需要多次! :D – 2013-07-22 08:04:01

+0

謝謝,這個解決方案也適用於MVC4。 – 2013-08-21 09:07:52

2

,如果你不希望創建客戶端腳本:

public class Customer 
    { 
     [Remote("CardExisting", "Validation", AdditionalFields = "CardNumber,LastName")] 
     public string FirstName { get; set; } 
     [Remote("CardExisting", "Validation", AdditionalFields = "FirstName,CardNumber")] 
     public string LastName { get; set; } 
     [Remote("CardExisting", "Validation", AdditionalFields = "FirstName,LastName")] 
     public string CardNumber { get; set; } 
    } 

而且在CardExisting各個領域驗證的填充或不