使用远程validation进行多个字段validation

我有以下型号:

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操作将检查firstName和LastName的cardNumber组合是否存在现有记录。

如果用户首先输入卡号然后输入他的名字,我无法validation他怎么办?所以当他返回并输入他的名字时我需要再次进行远程validation,如果焦点已经从cardnumber属性丢失了怎么办呢?

扩展了Jaluka的答案,我编写了这个帮助器方法,找到每个具有“附加字段”的远程validation元素,然后每当其中一个字段发生更改时,就会激活所述元素的validation。

 // 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")); }); 

我的工作方式是添加一些JavaScript。

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

因此,当更改名字时,您将清除卡号中的所有先前值并重新validation卡号。

如果您不想创建客户端脚本:

  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中validation所有字段是否已填充

继Chris上面的Chris帮助方法之后。 这在大多数情况下都很有用,但是如果你的模型有一个前缀,例如’Custom.Address.Line1’。 未正确找到其他字段。 我已经使用jquery.validate.unobstructive lib中的一些额外逻辑更新了帮助程序,它将正确地查找字段。

 function getModelPrefix(fieldName) { return fieldName.substr(0, fieldName.lastIndexOf(".") + 1); } function appendModelPrefix(value, prefix) { if (value.indexOf("*.") === 0) { value = value.replace("*.", prefix); } return value; } function escapeAttributeValue(value) { // As mentioned on http://api.jquery.com/category/selectors/ return value.replace(/([!"#$%&'()*+,./:;<=>?@\[\\\]^`{|}~])/g, "\\$1"); } function initializeRemotelyValidatingElementsWithAdditionalFields($form) { const remotelyValidatingElements = $form.find("[data-val-remote]"); $.each(remotelyValidatingElements, function (i, element) { var $element = $(element); const additionalFields = $element.attr("data-val-remote-additionalfields"); if (additionalFields.length === 0) return; const rawFieldNames = additionalFields.split(","); const prefix = getModelPrefix(element.name); const fieldNames = $.map(rawFieldNames, function(fieldName) { return appendModelPrefix(fieldName, prefix); }); $.each(fieldNames, function (i, fieldName) { $form.find(":input").filter("[name='" + escapeAttributeValue(fieldName) + "']").change(function () { // force re-validation to occur $element.removeData("previousValue"); $element.valid(); }); }); }); }