2015-07-03 2 views
1

У меня есть элемент управления регулярным выражением, который проверяет адрес электронной почты. Он проверяет, как ожидалось, за исключением того, что он делает это, когда управление теряет фокус. Я хочу, чтобы это подтверждалось только при отправке формы.Validate Email on form submit

<asp:TextBox ID="txtRegisterEmailAddress" type="email" ValidationGroup="UserProfile" runat="server" CssClass="form-control " Style="text-transform: lowercase" /> 
<asp:RegularExpressionValidator ID="revRegisterEmailAddress" runat="server" ControlToValidate="txtRegisterEmailAddress" ErrorMessage="* Invalid Email Address" Display="Dynamic" SetFocusOnError="true" ValidateRequestMode="Disabled" ForeColor="Red" ValidationGroup="UserProfile" ValidationExpression="^(([a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9]{2,10}(?:[a-z0-9-]*[a-z0-9])?)\s*?,?\s*?)+$" /> 
<asp:Button runat="server" ID="btnRegister" ClientIDMode="Static" ValidationGroup="UserProfile" CssClass="btn btn-default" OnClick="btnRegister_Click" Text="Register" OnClientClick="DisableReg();" UseSubmitBehavior="false" /> 

Пожалуйста, помогите.

EDIT:
Проверка должна происходить только тогда, когда я представляю, и не должны представить, если проверка не пройдена. В настоящее время он проверяет, теряя фокус контроля. Я не хочу переписывать процесс валидации, только изменение КОГДА оно проверяется.

+0

Нет Утилита, это не тот же вопрос. Это совершенно другое дело. – SollyM

+0

Вызовите метод проверки как одну из первых вещей в 'btnRegister_Click', таким образом вы можете убедиться, что он будет только отправляться, если он пройдет проверку. И проверка выполняется после подачи. –

+0

Пожалуйста, дайте мне указания в этом отношении @Malte. Есть ли какие-либо атрибуты RegularExpressionValidator, которые мне нужны? – SollyM

ответ

1

частично ответил here

Об инициализации отключите все группы проверки, которые вы не хотите увольнять «onblur», и используйте ValidatorEnable для onclick.

еще один вариант - отключить SetFocusOnError, если вы хотите, чтобы пользователи перешли к следующему элементу формы, но все еще показывают, что что-то не так с выражением. Форма не может быть отправлена ​​до тех пор, пока адрес электронной почты не будет исправлен.

ОБНОВЛЕНИЕ от OP: На странице Page_Load проверка будет отключена. Но после его включения не было никакого способа отключить его снова. Я добавил приведенный ниже код, чтобы отключить его снова в фокусе текстового поля, и это текстовое поле.

function TurnOffValidator(ControlToValidate) { 
    for (var i = 0; i < Page_Validators.length; i++) { 
     if (Page_Validators[i].controltovalidate === ControlToValidate) { 
      ValidatorEnable(Page_Validators[i], false); 
     } 
    } 
} 

function TurnOnValidator(ControlToValidate) { 
    for (var i = 0; i < Page_Validators.length; i++) { 
     if (Page_Validators[i].controltovalidate === ControlToValidate) { 
      ValidatorEnable(Page_Validators[i], true); 
     } 
    } 
} 

$('#<%= txtTextbox.ClientID %>').focus(function() { 
    TurnOffValidator("<%= txtTextbox.ClientID %>"); 
}); 
1

Вы могли бы сделать метод для проверки электронной почты, который может возвращать логическое значение:

public class RegexUtilities 
    { 
     bool invalid = false; 

     public bool IsValidEmail(string strIn) 
     { 
      invalid = false; 
      if (String.IsNullOrEmpty(strIn)) 
       return false; 

      // Use IdnMapping class to convert Unicode domain names. 
      try 
      { 
       strIn = Regex.Replace(strIn, @"(@)(.+)$", this.DomainMapper, 
             RegexOptions.None, TimeSpan.FromMilliseconds(200)); 
      } 
      catch (RegexMatchTimeoutException) 
      { 
       return false; 
      } 

      if (invalid) 
       return false; 

      // Return true if strIn is in valid e-mail format. 
      try 
      { 
       return Regex.IsMatch(strIn, 
         @"^(?("")("".+?(?<!\\)""@)|(([0-9a-z]((\.(?!\.))|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)(?<=[0-9a-z])@))" + 
         @"(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-z][-\w]*[0-9a-z]*\.)+[a-z0-9][\-a-z0-9]{0,22}[a-z0-9]))$", 
         RegexOptions.IgnoreCase, TimeSpan.FromMilliseconds(250)); 
      } 
      catch (RegexMatchTimeoutException) 
      { 
       return false; 
      } 
     } 

     private string DomainMapper(Match match) 
     { 
      // IdnMapping class with default property values. 
      IdnMapping idn = new IdnMapping(); 

      string domainName = match.Groups[2].Value; 
      try 
      { 
       domainName = idn.GetAscii(domainName); 
      } 
      catch (ArgumentException) 
      { 
       invalid = true; 
      } 
      return match.Groups[1].Value + domainName; 
     } 
    } 

Взятые непосредственно из MSDN

, а затем запустить этот метод как первое, что в btnRegister_Click и использовать возвращение значение, чтобы определить, продолжать или нет.

Если метод возвращает false, вы можете сообщить об этом пользователю через текстовое поле, или каким-либо другим способом, а затем остановить метод представить вернув:

public void btnRegister_Click(...) 
{ 
    var emailValidator = new RegexUtilities(); 
    bool validEmail = emailValidator.IsValidEmail(..textbox-input..); 

    if (!validEmail) 
    { 
     txtError.Text = "Enter a valid email please"; 
     return; 
    } 
    //... 
    //... 
    //(Your submit code) 
} 

Edit: Исправлена ​​недостающий код

+0

В вашем коде есть ошибки, которые я пытаюсь исправить ... вокруг переменной 'invalid'. Он не существует в контексте DomainMapper. – SollyM

+0

См. Отредактированный код –

+0

И проверьте ссылку MSDN. Он объясняет код кодом. –