Пользовательский TextBox со встроенным валидатором: проверка на стороне сервера не запускается - PullRequest
0 голосов
/ 19 ноября 2008

У меня есть класс, который выглядит так:

public class TextField : TextBox
{
   public bool Required { get; set; }
   RequiredFieldValidator _validator;

   protected override void CreateChildControls()
   {
      base.CreateChildControls();


      _validator = new RequiredFieldValidator();
      _validator.ControlToValidate = this.ID;
      if(Required)
          Controls.Add(_validator);
   }

   public override void Render(HtmlTextWriter tw)
   {
      base.Render(tw);

      if(Required)
         _validator.RenderControl(tw);
   }
}

Это работает некоторое время во внутреннем приложении, где всегда включен javascript. Недавно я заметил, что вышестоящая ошибка javascript может помешать запуску валидаторов, поэтому проверка на стороне сервера должна начаться ... правильно? право?

Таким образом, свойство Page.IsValid всегда возвращает true (я даже пытался явно вызвать Page.Validate () заранее).

После некоторых копаний я обнаружил, что метод init валидатора должен добавить валидатор на страницу, но из-за того, как я его создаю, я не думаю, что это когда-либо случится. Таким образом, проверка на стороне клиента работает, а проверка на стороне сервера - нет.

Я пробовал это:

protected override OnInit()
{
   base.OnInit();

   Page.Validators.Add(_validator); // <-- validator is null here
}

Но, конечно, валидатор здесь равен нулю (и иногда он не требуется, поэтому его не следует добавлять) ... но OnInit () действительно рано для меня принимать такие решения (свойство Required не было бы загружается из ViewState, например).

Идеи

Ответы [ 2 ]

1 голос
/ 19 ноября 2008

CreateChildControls в основном для элементов управления, которые имеют дочерние элементы. RequiredFieldValidator похож на одноуровневый элемент TextBox.

Вот код, который работает для меня:

public class RequiredTextBox : TextBox
    {
        private RequiredFieldValidator _req;
        private string _errorMessage;

        public string ErrorMessage
        {
            get { return _errorMessage; }
            set { _errorMessage = value; } 
        }

        protected override void OnInit(EventArgs e)
        {
            _req = new RequiredFieldValidator();
            _req.ControlToValidate = this.ID;
            _req.ErrorMessage = _errorMessage;
            Controls.Add(_req);
            base.OnInit(e); 
        }       

        protected override void Render(System.Web.UI.HtmlTextWriter writer)
        {
            base.Render(writer);
            _req.RenderControl(writer); 
        }
    }

А вот это страница ASP.NET позади:

 protected void SubmitClick(object sender, EventArgs e)
        {
            if(Page.IsValid)
            {
                // do something
            }
        }

А вот код ASPX:

 <MyControl:RequiredTextBox runat="server" ErrorMessage="Name is required!" ID="txtName"></MyControl:RequiredTextBox>

    <asp:Button ID="Btn_Submit" runat="server" Text="Submit" OnClick="SubmitClick" /> 
0 голосов
/ 19 ноября 2008

Валидаторы должны наследоваться от BaseValidator.

...