【问题标题】:Multiple fields validation using Remote Validation使用远程验证进行多字段验证
【发布时间】:2012-04-15 16:11:27
【问题描述】:

我有以下型号:

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 组合的现有记录。

如果用户先输入卡号然后输入他的名字,我无法验证他,所以当他返回并输入他的名字时我需要再次远程验证,当焦点已经从 cardnumber 属性中丢失时我该怎么做?

【问题讨论】:

    标签: c# asp.net-mvc asp.net-mvc-3 remote-validation


    【解决方案1】:

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

    【讨论】:

    • W00t!!!两天前你回答了这个问题,我现在才需要它......你的代码工作得很好! :) 在我的情况下,我有 2 个必须一起工作的下拉菜单,也就是说,一个是另一个的附加字段。对于应该是默认恕我直言的东西的美丽解决方案。 :)
    • 嘿嘿嘿我也不喜欢给事物起名字...但是考虑到我们职业的性质,它本质上是每天多次命名的必要条件! :D
    • 确实,不敢相信这不是默认行为。瘸。谢谢@Kiff 和 Jaluka
    【解决方案2】:

    我得到这个工作的方法是添加一些 JavaScript。

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

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

    【讨论】:

      【解决方案3】:

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

          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 中的所有字段是否填写

      【讨论】:

        【解决方案4】:

        从上面 Chris 的辅助方法开始。这在大多数情况下都很好用,但是如果您的模型根本没有前缀,例如'Custom.Address.Line1' 。未正确找到附加字段。我已经使用 jquery.validate.unobstructive 库中的一些附加逻辑更新了帮助程序,这些逻辑将正确查找字段。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多