Валидаторы / элементы управления будут выполняться всегда, даже если условие ложно - PullRequest
0 голосов
/ 11 января 2019

У меня есть опыт разработки с ASP.NET MVC, но мне приходится иметь дело с запаздывающим веб-приложением с веб-формами.

У меня есть 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 голосов
/ 12 января 2019

Мой ответ ниже основан на предположении, что условие для валидаторов для оценки отличается от условия для элемента управления вводом / валидаторов, которые должны быть представлены.

Существует стандартная функция JavaScript, которая называется ValidatorValidate, когда вы используете проверку в веб-формах. Вам нужно переопределить это, используя пример кода, как показано ниже, для реализации вашего требования.

Важным моментом, который следует иметь в виду в этом решении, является размещение приведенного ниже кода непосредственно перед закрывающим тегом тела, чтобы перезаписываемая функция уже была загружена в браузер, иначе вы можете получить ошибку JavaScript, сообщающую, что window.ValidatorValidate не определено .

Кроме того, реализуйте то же требование на стороне сервера, используя приведенный ниже код C #, поскольку валидаторы оцениваются как на стороне клиента, так и на стороне сервера.

Переопределить функцию ValidatorValidate в JavaScript

<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>

C # код для переопределения оценки валидаторов на стороне сервера

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

Другой вариант, вместо использования описанного выше подхода - определять только пользовательские валидаторы (без стандартных валидаторов, таких как requiredfieldvalidator или comparevalidator и т. Д.) В блоке условия if, а затем в каждой пользовательской функции валидатора на стороне клиента, просто проверьте условие и, если оно истинно, укажите args.IsValid = true; в нем. Сделайте то же самое для событий на стороне сервера, которые вы используете для этих пользовательских валидаторов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...