2012-04-15 110 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各个领域验证的填充或不