捕获asp.net ValidationSummary 控件消息。

      今天在改代码时,要把以前的ValidationSummary服务器控件,弹出验证信息后跳转页面。如果重新写客户端脚本验证太麻烦。所以想找个偷懒的方法,最好可以重载ValidationSummary 验证信息。那就开始找吧。

首先,在aspnetForm 上会调用 onsubmit="javascript:return WebForm_OnSubmit();",

当页面存在验证控件时: 

function WebForm_OnSubmit() {

   if (typeof(ValidatorOnSubmit) == "function" && ValidatorOnSubmit() == false) 

   return false;

 return true;

}

当页面不存在验证控件时:

function WebForm_OnSubmit() {

    null;

   return true;

}

 

这里我不考虑页面不存在验证控件的现象。

接着页面会调用 ValidatorOnSubmit 函数

var Page_ValidationActive = false;

if (typeof(ValidatorOnLoad) == "function") {    

  ValidatorOnLoad();

} 



function ValidatorOnSubmit() {   

    if (Page_ValidationActive) { 

           return ValidatorCommonOnSubmit();    

    }

    else { 

       return true; 

   }

}

然后在asp.net 中的验证脚本中会有个叫ValidatorCommonOnSubmit 的函数,这个验证脚本可以在ScriptResource.axd 中找到

页面在加载时会注册Page_ClientValidate(validationGroup) 函数。(但是说实话没太看懂ValidatorCommonOnSubmit和Page_ClientValidate之间是如何调用。)

if (causesValidation && (typeof(Page_ClientValidate) === 'function') && !Page_ClientValidate(validationGroup || null)) {            return;        }

最后在Page_ClientValidate函数中会调用 VlidationSummaryOnSubmit(validationGroup),在这里 asp.net ValidationSummary的消息就可以任我宰割了。

跟了一下代码后,虽然asp.net 验证控件最终还是用javascript验证的,但是他为了考虑不环境和意外境况,做了很多额外的处理。倒不如在做验证时,自己写脚本验证这样又节省性能,有容易控制。

以下是asp.net 验证控件的代码(可以在ScriptResource.axd 中找到)

var Page_ValidationVer = "125";

var Page_IsValid = true;

var Page_BlockSubmit = false;

var Page_InvalidControlToBeFocused = null;

function ValidatorUpdateDisplay(val) {

    if (typeof (val.display) == "string") {

        if (val.display == "None") {

            return;

        }

        if (val.display == "Dynamic") {

            val.style.display = val.isvalid ? "none" : "inline";

            return;

        }

    }

    if ((navigator.userAgent.indexOf("Mac") > -1) &&

        (navigator.userAgent.indexOf("MSIE") > -1)) {

        val.style.display = "inline";

    }

    val.style.visibility = val.isvalid ? "hidden" : "visible";

}

function ValidatorUpdateIsValid() {

    Page_IsValid = AllValidatorsValid(Page_Validators);

}

function AllValidatorsValid(validators) {

    if ((typeof (validators) != "undefined") && (validators != null)) {

        var i;

        for (i = 0; i < validators.length; i++) {

            if (!validators[i].isvalid) {

                return false;

            }

        }

    }

    return true;

}

function ValidatorHookupControlID(controlID, val) {

    if (typeof (controlID) != "string") {

        return;

    }

    var ctrl = document.getElementById(controlID);

    if ((typeof (ctrl) != "undefined") && (ctrl != null)) {

        ValidatorHookupControl(ctrl, val);

    }

    else {

        val.isvalid = true;

        val.enabled = false;

    }

}

function ValidatorHookupControl(control, val) {

    if (typeof (control.tagName) != "string") {

        return;

    }

    if (control.tagName != "INPUT" && control.tagName != "TEXTAREA" && control.tagName != "SELECT") {

        var i;

        for (i = 0; i < control.childNodes.length; i++) {

            ValidatorHookupControl(control.childNodes[i], val);

        }

        return;

    }

    else {

        if (typeof (control.Validators) == "undefined") {

            control.Validators = new Array;

            var eventType;

            if (control.type == "radio") {

                eventType = "onclick";

            } else {

                eventType = "onchange";

                if (typeof (val.focusOnError) == "string" && val.focusOnError == "t") {

                    ValidatorHookupEvent(control, "onblur", "ValidatedControlOnBlur(event); ");

                }

            }

            ValidatorHookupEvent(control, eventType, "ValidatorOnChange(event); ");

            if (control.type == "text" ||

                control.type == "password" ||

                control.type == "file") {

                ValidatorHookupEvent(control, "onkeypress",

                    "if (!ValidatedTextBoxOnKeyPress(event)) { event.cancelBubble = true; if (event.stopPropagation) event.stopPropagation(); return false; } ");

            }

        }

        control.Validators[control.Validators.length] = val;

    }

}

function ValidatorHookupEvent(control, eventType, functionPrefix) {

    var ev;

    eval("ev = control." + eventType + ";");

    if (typeof (ev) == "function") {

        ev = ev.toString();

        ev = ev.substring(ev.indexOf("{") + 1, ev.lastIndexOf("}"));

    }

    else {

        ev = "";

    }

    var func;

    if (navigator.appName.toLowerCase().indexOf('explorer') > -1) {

        func = new Function(functionPrefix + " " + ev);

    }

    else {

        func = new Function("event", functionPrefix + " " + ev);

    }

    eval("control." + eventType + " = func;");

}

function ValidatorGetValue(id) {

    var control;

    control = document.getElementById(id);

    if (typeof (control.value) == "string") {

        return control.value;

    }

    return ValidatorGetValueRecursive(control);

}

function ValidatorGetValueRecursive(control) {

    if (typeof (control.value) == "string" && (control.type != "radio" || control.checked == true)) {

        return control.value;

    }

    var i, val;

    for (i = 0; i < control.childNodes.length; i++) {

        val = ValidatorGetValueRecursive(control.childNodes[i]);

        if (val != "") return val;

    }

    return "";

}

function Page_ClientValidate(validationGroup) {

    Page_InvalidControlToBeFocused = null;

    if (typeof (Page_Validators) == "undefined") {

        return true;

    }

    var i;

    for (i = 0; i < Page_Validators.length; i++) {

        ValidatorValidate(Page_Validators[i], validationGroup, null);

    }

    ValidatorUpdateIsValid();

    ValidationSummaryOnSubmit(validationGroup);

    Page_BlockSubmit = !Page_IsValid;

    return Page_IsValid;

}

function ValidatorCommonOnSubmit() {

    Page_InvalidControlToBeFocused = null;

    var result = !Page_BlockSubmit;

    if ((typeof (window.event) != "undefined") && (window.event != null)) {

        window.event.returnValue = result;

    }

    Page_BlockSubmit = false;

    return result;

}

function ValidatorEnable(val, enable) {

    val.enabled = (enable != false);

    ValidatorValidate(val);

    ValidatorUpdateIsValid();

}

function ValidatorOnChange(event) {

    if (!event) {

        event = window.event;

    }

    Page_InvalidControlToBeFocused = null;

    var targetedControl;

    if ((typeof (event.srcElement) != "undefined") && (event.srcElement != null)) {

        targetedControl = event.srcElement;

    }

    else {

        targetedControl = event.target;

    }

    var vals;

    if (typeof (targetedControl.Validators) != "undefined") {

        vals = targetedControl.Validators;

    }

    else {

        if (targetedControl.tagName.toLowerCase() == "label") {

            targetedControl = document.getElementById(targetedControl.htmlFor);

            vals = targetedControl.Validators;

        }

    }

    var i;

    for (i = 0; i < vals.length; i++) {

        ValidatorValidate(vals[i], null, event);

    }

    ValidatorUpdateIsValid();

}

function ValidatedTextBoxOnKeyPress(event) {

    if (event.keyCode == 13) {

        ValidatorOnChange(event);

        var vals;

        if ((typeof (event.srcElement) != "undefined") && (event.srcElement != null)) {

            vals = event.srcElement.Validators;

        }

        else {

            vals = event.target.Validators;

        }

        return AllValidatorsValid(vals);

    }

    return true;

}

function ValidatedControlOnBlur(event) {

    var control;

    if ((typeof (event.srcElement) != "undefined") && (event.srcElement != null)) {

        control = event.srcElement;

    }

    else {

        control = event.target;

    }

    if ((typeof (control) != "undefined") && (control != null) && (Page_InvalidControlToBeFocused == control)) {

        control.focus();

        Page_InvalidControlToBeFocused = null;

    }

}

function ValidatorValidate(val, validationGroup, event) {

    val.isvalid = true;

    if ((typeof (val.enabled) == "undefined" || val.enabled != false) && IsValidationGroupMatch(val, validationGroup)) {

        if (typeof (val.evaluationfunction) == "function") {

            val.isvalid = val.evaluationfunction(val);

            if (!val.isvalid && Page_InvalidControlToBeFocused == null &&

                typeof (val.focusOnError) == "string" && val.focusOnError == "t") {

                ValidatorSetFocus(val, event);

            }

        }

    }

    ValidatorUpdateDisplay(val);

}

function ValidatorSetFocus(val, event) {

    var ctrl;

    if (typeof (val.controlhookup) == "string") {

        var eventCtrl;

        if ((typeof (event) != "undefined") && (event != null)) {

            if ((typeof (event.srcElement) != "undefined") && (event.srcElement != null)) {

                eventCtrl = event.srcElement;

            }

            else {

                eventCtrl = event.target;

            }

        }

        if ((typeof (eventCtrl) != "undefined") && (eventCtrl != null) &&

            (typeof (eventCtrl.id) == "string") &&

            (eventCtrl.id == val.controlhookup)) {

            ctrl = eventCtrl;

        }

    }

    if ((typeof (ctrl) == "undefined") || (ctrl == null)) {

        ctrl = document.getElementById(val.controltovalidate);

    }

    if ((typeof (ctrl) != "undefined") && (ctrl != null) &&

        (ctrl.tagName.toLowerCase() != "table" || (typeof (event) == "undefined") || (event == null)) &&

        ((ctrl.tagName.toLowerCase() != "input") || (ctrl.type.toLowerCase() != "hidden")) &&

        (typeof (ctrl.disabled) == "undefined" || ctrl.disabled == null || ctrl.disabled == false) &&

        (typeof (ctrl.visible) == "undefined" || ctrl.visible == null || ctrl.visible != false) &&

        (IsInVisibleContainer(ctrl))) {

        if ((ctrl.tagName.toLowerCase() == "table" && (typeof (__nonMSDOMBrowser) == "undefined" || __nonMSDOMBrowser)) ||

            (ctrl.tagName.toLowerCase() == "span")) {

            var inputElements = ctrl.getElementsByTagName("input");

            var lastInputElement = inputElements[inputElements.length - 1];

            if (lastInputElement != null) {

                ctrl = lastInputElement;

            }

        }

        if (typeof (ctrl.focus) != "undefined" && ctrl.focus != null) {

            ctrl.focus();

            Page_InvalidControlToBeFocused = ctrl;

        }

    }

}

function IsInVisibleContainer(ctrl) {

    if (typeof (ctrl.style) != "undefined" &&

        ((typeof (ctrl.style.display) != "undefined" &&

            ctrl.style.display == "none") ||

          (typeof (ctrl.style.visibility) != "undefined" &&

            ctrl.style.visibility == "hidden"))) {

        return false;

    }

    else if (typeof (ctrl.parentNode) != "undefined" &&

             ctrl.parentNode != null &&

             ctrl.parentNode != ctrl) {

        return IsInVisibleContainer(ctrl.parentNode);

    }

    return true;

}

function IsValidationGroupMatch(control, validationGroup) {

    if ((typeof (validationGroup) == "undefined") || (validationGroup == null)) {

        return true;

    }

    var controlGroup = "";

    if (typeof (control.validationGroup) == "string") {

        controlGroup = control.validationGroup;

    }

    return (controlGroup == validationGroup);

}

function ValidatorOnLoad() {

    if (typeof (Page_Validators) == "undefined")

        return;

    var i, val;

    for (i = 0; i < Page_Validators.length; i++) {

        val = Page_Validators[i];

        if (typeof (val.evaluationfunction) == "string") {

            eval("val.evaluationfunction = " + val.evaluationfunction + ";");

        }

        if (typeof (val.isvalid) == "string") {

            if (val.isvalid == "False") {

                val.isvalid = false;

                Page_IsValid = false;

            }

            else {

                val.isvalid = true;

            }

        } else {

            val.isvalid = true;

        }

        if (typeof (val.enabled) == "string") {

            val.enabled = (val.enabled != "False");

        }

        if (typeof (val.controltovalidate) == "string") {

            ValidatorHookupControlID(val.controltovalidate, val);

        }

        if (typeof (val.controlhookup) == "string") {

            ValidatorHookupControlID(val.controlhookup, val);

        }

    }

    Page_ValidationActive = true;

}

function ValidatorConvert(op, dataType, val) {

    function GetFullYear(year) {

        var twoDigitCutoffYear = val.cutoffyear % 100;

        var cutoffYearCentury = val.cutoffyear - twoDigitCutoffYear;

        return ((year > twoDigitCutoffYear) ? (cutoffYearCentury - 100 + year) : (cutoffYearCentury + year));

    }

    var num, cleanInput, m, exp;

    if (dataType == "Integer") {

        exp = /^\s*[-\+]?\d+\s*$/;

        if (op.match(exp) == null)

            return null;

        num = parseInt(op, 10);

        return (isNaN(num) ? null : num);

    }

    else if (dataType == "Double") {

        exp = new RegExp("^\\s*([-\\+])?(\\d*)\\" + val.decimalchar + "?(\\d*)\\s*$");

        m = op.match(exp);

        if (m == null)

            return null;

        if (m[2].length == 0 && m[3].length == 0)

            return null;

        cleanInput = (m[1] != null ? m[1] : "") + (m[2].length > 0 ? m[2] : "0") + (m[3].length > 0 ? "." + m[3] : "");

        num = parseFloat(cleanInput);

        return (isNaN(num) ? null : num);

    }

    else if (dataType == "Currency") {

        var hasDigits = (val.digits > 0);

        var beginGroupSize, subsequentGroupSize;

        var groupSizeNum = parseInt(val.groupsize, 10);

        if (!isNaN(groupSizeNum) && groupSizeNum > 0) {

            beginGroupSize = "{1," + groupSizeNum + "}";

            subsequentGroupSize = "{" + groupSizeNum + "}";

        }

        else {

            beginGroupSize = subsequentGroupSize = "+";

        }

        exp = new RegExp("^\\s*([-\\+])?((\\d" + beginGroupSize + "(\\" + val.groupchar + "\\d" + subsequentGroupSize + ")+)|\\d*)"

                        + (hasDigits ? "\\" + val.decimalchar + "?(\\d{0," + val.digits + "})" : "")

                        + "\\s*$");

        m = op.match(exp);

        if (m == null)

            return null;

        if (m[2].length == 0 && hasDigits && m[5].length == 0)

            return null;

        cleanInput = (m[1] != null ? m[1] : "") + m[2].replace(new RegExp("(\\" + val.groupchar + ")", "g"), "") + ((hasDigits && m[5].length > 0) ? "." + m[5] : "");

        num = parseFloat(cleanInput);

        return (isNaN(num) ? null : num);

    }

    else if (dataType == "Date") {

        var yearFirstExp = new RegExp("^\\s*((\\d{4})|(\\d{2}))([-/]|\\. ?)(\\d{1,2})\\4(\\d{1,2})\\.?\\s*$");

        m = op.match(yearFirstExp);

        var day, month, year;

        if (m != null && (m[2].length == 4 || val.dateorder == "ymd")) {

            day = m[6];

            month = m[5];

            year = (m[2].length == 4) ? m[2] : GetFullYear(parseInt(m[3], 10))

        }

        else {

            if (val.dateorder == "ymd") {

                return null;

            }

            var yearLastExp = new RegExp("^\\s*(\\d{1,2})([-/]|\\. ?)(\\d{1,2})(?:\\s|\\2)((\\d{4})|(\\d{2}))(?:\\s\u0433\\.)?\\s*$");

            m = op.match(yearLastExp);

            if (m == null) {

                return null;

            }

            if (val.dateorder == "mdy") {

                day = m[3];

                month = m[1];

            }

            else {

                day = m[1];

                month = m[3];

            }

            year = (m[5].length == 4) ? m[5] : GetFullYear(parseInt(m[6], 10))

        }

        month -= 1;

        var date = new Date(year, month, day);

        if (year < 100) {

            date.setFullYear(year);

        }

        return (typeof (date) == "object" && year == date.getFullYear() && month == date.getMonth() && day == date.getDate()) ? date.valueOf() : null;

    }

    else {

        return op.toString();

    }

}

function ValidatorCompare(operand1, operand2, operator, val) {

    var dataType = val.type;

    var op1, op2;

    if ((op1 = ValidatorConvert(operand1, dataType, val)) == null)

        return false;

    if (operator == "DataTypeCheck")

        return true;

    if ((op2 = ValidatorConvert(operand2, dataType, val)) == null)

        return true;

    switch (operator) {

        case "NotEqual":

            return (op1 != op2);

        case "GreaterThan":

            return (op1 > op2);

        case "GreaterThanEqual":

            return (op1 >= op2);

        case "LessThan":

            return (op1 < op2);

        case "LessThanEqual":

            return (op1 <= op2);

        default:

            return (op1 == op2);

    }

}

function CompareValidatorEvaluateIsValid(val) {

    var value = ValidatorGetValue(val.controltovalidate);

    if (ValidatorTrim(value).length == 0)

        return true;

    var compareTo = "";

    if ((typeof (val.controltocompare) != "string") ||

        (typeof (document.getElementById(val.controltocompare)) == "undefined") ||

        (null == document.getElementById(val.controltocompare))) {

        if (typeof (val.valuetocompare) == "string") {

            compareTo = val.valuetocompare;

        }

    }

    else {

        compareTo = ValidatorGetValue(val.controltocompare);

    }

    var operator = "Equal";

    if (typeof (val.operator) == "string") {

        operator = val.operator;

    }

    return ValidatorCompare(value, compareTo, operator, val);

}

function CustomValidatorEvaluateIsValid(val) {

    var value = "";

    if (typeof (val.controltovalidate) == "string") {

        value = ValidatorGetValue(val.controltovalidate);

        if ((ValidatorTrim(value).length == 0) &&

            ((typeof (val.validateemptytext) != "string") || (val.validateemptytext != "true"))) {

            return true;

        }

    }

    var args = { Value: value, IsValid: true };

    if (typeof (val.clientvalidationfunction) == "string") {

        eval(val.clientvalidationfunction + "(val, args) ;");

    }

    return args.IsValid;

}

function RegularExpressionValidatorEvaluateIsValid(val) {

    var value = ValidatorGetValue(val.controltovalidate);

    if (ValidatorTrim(value).length == 0)

        return true;

    var rx = new RegExp(val.validationexpression);

    var matches = rx.exec(value);

    return (matches != null && value == matches[0]);

}

function ValidatorTrim(s) {

    var m = s.match(/^\s*(\S+(\s+\S+)*)\s*$/);

    return (m == null) ? "" : m[1];

}

function RequiredFieldValidatorEvaluateIsValid(val) {

    return (ValidatorTrim(ValidatorGetValue(val.controltovalidate)) != ValidatorTrim(val.initialvalue))

}

function RangeValidatorEvaluateIsValid(val) {

    var value = ValidatorGetValue(val.controltovalidate);

    if (ValidatorTrim(value).length == 0)

        return true;

    return (ValidatorCompare(value, val.minimumvalue, "GreaterThanEqual", val) &&

            ValidatorCompare(value, val.maximumvalue, "LessThanEqual", val));

}

function ValidationSummaryOnSubmit(validationGroup) {

    if (typeof (Page_ValidationSummaries) == "undefined")

        return;

    var summary, sums, s;

    for (sums = 0; sums < Page_ValidationSummaries.length; sums++) {

        summary = Page_ValidationSummaries[sums];

        summary.style.display = "none";

        if (!Page_IsValid && IsValidationGroupMatch(summary, validationGroup)) {

            var i;

            if (summary.showsummary != "False") {

                summary.style.display = "";

                if (typeof (summary.displaymode) != "string") {

                    summary.displaymode = "BulletList";

                }

                switch (summary.displaymode) {

                    case "List":

                        headerSep = "<br>";

                        first = "";

                        pre = "";

                        post = "<br>";

                        end = "";

                        break;

                    case "BulletList":

                    default:

                        headerSep = "";

                        first = "<ul>";

                        pre = "<li>";

                        post = "</li>";

                        end = "</ul>";

                        break;

                    case "SingleParagraph":

                        headerSep = " ";

                        first = "";

                        pre = "";

                        post = " ";

                        end = "<br>";

                        break;

                }

                s = "";

                if (typeof (summary.headertext) == "string") {

                    s += summary.headertext + headerSep;

                }

                s += first;

                for (i = 0; i < Page_Validators.length; i++) {

                    if (!Page_Validators[i].isvalid && typeof (Page_Validators[i].errormessage) == "string") {

                        s += pre + Page_Validators[i].errormessage + post;

                    }

                }

                s += end;

                summary.innerHTML = s;

                window.scrollTo(0, 0);

            }

            if (summary.showmessagebox == "True") {

                s = "";

                if (typeof (summary.headertext) == "string") {

                    s += summary.headertext + "\r\n";

                }

                var lastValIndex = Page_Validators.length - 1;

                for (i = 0; i <= lastValIndex; i++) {

                    if (!Page_Validators[i].isvalid && typeof (Page_Validators[i].errormessage) == "string") {

                        switch (summary.displaymode) {

                            case "List":

                                s += Page_Validators[i].errormessage;

                                if (i < lastValIndex) {

                                    s += "\r\n";

                                }

                                break;

                            case "BulletList":

                            default:

                                s += "- " + Page_Validators[i].errormessage;

                                if (i < lastValIndex) {

                                    s += "\r\n";

                                }

                                break;

                            case "SingleParagraph":

                                s += Page_Validators[i].errormessage + " ";

                                break;

                        }

                    }

                }

                s += "- Wilt u de informatie compleet?"

                if (confirm(s)) {

                    window.location.href = "/storeCreateProfile.aspx";

                }

            }

        }

    }

}



//if (typeof (Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();

你可能感兴趣的:(validation)