验证器/控件将始终执行,即使条件为假

时间:2019-01-11 10:10:54

标签: asp.net validation webforms

我在使用ASP.NET MVC进行开发方面经验丰富,但是必须处理具有Web表单的滞后Web应用程序。

我有一个html表单,里面有几个输入字段和验证器(<asp:TextBox /><asp:CustomValidator /><ajax:MaskedEditValidator />)。

仅当条件解析为true时,才应呈现/可见表单的第二部分。同样,此块内的关联验证程序仅应在给定条件解析为true时进行验证。为此,我将各个部分包装在条件块中:

<%
  if (condition)
  {
%>
    ...

    <ajax:MaskedEditExtender runat="server" ID="meePreisProGruppe" TargetControlID="PreisProGruppeInsertTextBox"
      Mask="999" MessageValidatorTip="true" OnFocusCssClass="MaskedEditFocus"
      OnInvalidCssClass="MaskedEditError" MaskType="Number" InputDirection="RightToLeft"
      AutoComplete="false" ErrorTooltipEnabled="True" />

    <ajax:MaskedEditValidator ID="mevPreisProGruppe" runat="server" ValidationGroup="vgBuchungsanfrageMP"
      ControlExtender="meePreisProGruppe" ControlToValidate="PreisProGruppeInsertTextBox" IsValidEmpty="false"
      InvalidValueMessage="Preis p.Gruppe ungültig" emptyvaluemessage="Preis p.Gruppe fehlt" EmptyValueBlurredText='<img src="/bsb/img/srf/icon_exclamation_error.gif">'
      InvalidValueBlurredMessage='<img src="/bsb/img/srf/icon_exclamation_error.gif">'
      Display="Dynamic" />

    ...

    <asp:CustomValidator ID="cvRechnungsadresse" Display="Dynamic" ErrorMessage="Rechnungsadresse nicht vollständig!"
      OnServerValidate="ServerValidationRechnungsadresse" ValidationGroup="vgBuchungsanfrageMP"
      runat="server" />

    ...
<%
  }
%>

有了这个,控件不会被渲染,这就是我想要的。但是,所有验证器都将独立于条件解决的条件执行。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

我在下面的回答是基于这样一个假设,即验证者评估的条件与要呈现的输入控件/验证者的条件不同。

在Web表单中使用验证时,有一个名为NodeList.prototype.forEach的标准JavaScript函数。您需要使用下面的示例代码来覆盖它,以实现您的要求。

此解决方案要记住的重要一点是,将代码放在关闭body标记之前,因此被覆盖的函数已经在浏览器中加载,否则您可能会收到JavaScript错误,指出window.ValidatorValidate未定义

此外,由于验证程序是在客户端和服务器端进行评估的,因此,使用下面的C#代码在服务器端实现相同的要求。

覆盖JavaScript中的ValidatorValidate函数

ValidatorValidate

C#代码以覆盖服务器端的验证器评估

<script type="text/javascript">

//create a condition in JavaScript for your validators to validate
//make condition a global variable, like here ( don't set it inside a function)

var condition = ...; //write your condition code on right side of equal operator

//populate this array with client ID's of all validators for which you want to conditionally validate
var conditionalValidatorIds = [];
conditionalValidatorIds.push("<%= validator1.CleintID%>";
conditionalValidatorIds.push("<%= validator2.CleintID%>";
conditionalValidatorIds.push("<%= validator5.CleintID%>";

//now override the standard ValidatorValidate function
var originalValidatorValidate = window.ValidatorValidate;

window.ValidatorValidate = function (val, validationGroup, event) {
    //check if the condition is true and if yes then skip this function for all 
    //validators within the conditionalValidatorIds array
    if(condition === true) {
        for(var i=0; i < conditionalValidatorIds.length; i++) {
            if( val.id === conditionalValidatorIds[i] ) {
                val.isvalid =  true;
                ValidatorUpdateDisplay(val);
                return;
            }
        }
    }

    //perform original validation when condition is false
    window.originalValidatorValidate(val, validationGroup, event);
}

</script>

另一个选择而不是使用上述方法的方法是在if条件块中然后在每个自定义验证器客户端函数中仅定义自定义验证器(没有标准验证器,例如requiredfieldvalidator或comparevalidator等),只需检查条件,如果条件为true,则在其中设置public override void Validate(string validationGroup) { //you will need to define yourCondition on server-side bool enableValidators = (someCondition === true); //then enable/disable your validators based on above condition validator1.Enabled = enableValidators; validator2.Enabled = enableValidators validator3.Enabled = enableValidators; base.Validate(validationGroup); } 。对这些自定义验证器的服务器端事件执行相同的操作。