2013-02-12 2 views
2

У меня есть настраиваемый серверный элемент управления, который содержит три текстовых поля. Мне нужно проверить его содержимое с помощью проверок полей ASP.NET.Проверка текстового поля в Server Control с использованием RequiredFieldValidator

Я установил 'ControlToValidate' свойство RequiredFieldValidator для свойства ID моего текстового поля, но похоже, что валидатор не может найти это текстовое поле. Вот упрощенный код, что я пытаюсь сделать (поля и свойства, которые не используются в настоящее время опущены):

[DefaultProperty("Text")] 
[ToolboxData("<{0}:ServerControl runat=server></{0}:ServerControl>")] 
public class CommentServerControl : WebControl, IPostBackDataHandler 
{ 
    private TextBox _textBoxName; 
    private RequiredFieldValidator _requiredName; 

    protected override void OnInit(EventArgs e) 
    { 
     var idName = "Name-" + UniqueID; 
     _textBoxName = new TextBox(); 
     _textBoxName.ID = idName; 
     _textBoxName.ClientIDMode = System.Web.UI.ClientIDMode.Static; 
     _textBoxName.ValidationGroup = ValidationGroup; // is set up via mark up 
     Controls.Add(_textBoxName); 
     _requiredName = new RequiredFieldValidator(); 
     _requiredName.ID = "RequiredName-" + UniqueID; 
     _requiredName.ValidationGroup = ValidationGroup; 
     _requiredName.ErrorMessage = RequiredMessage; // is set up via mark up 
     _requiredName.ControlToValidate = _textBoxName.ID; 
     Controls.Add(_requiredName); 
    } 

    public string ValidationGroup 
    { 
     get 
     { 
      var s = (string)ViewState["ValidationGroup"]; 
      return (s ?? string.Empty); 
     } 
     set 
     { 
      ViewState["ValidationGroup"] = value; 
     } 
    } 

    public string RequiredMessage 
    { 
     get 
     { 
      var s = (string)ViewState["RequiredMessage"]; 
      return (s ?? string.Empty); 
     } 
     set 
     { 
      ViewState["RequiredMessage"] = value; 
     } 
    } 
} 

Running этот код, я получаю сообщение об ошибке «Не удается найти идентификатор элемента управления» Name -ctl00 $ MainContent $ ctl00 ', на которое ссылается свойство ControlToValidate' RequiredName '. '

Я читал, что это может произойти из-за того, что элементы управления имеют различный NamingContainer, но в этом случае ссылки на NamingContainer одинаковы. Однако, Метод FindControl (string id) не может найти мой элемент управления textbox в методе OnInit. Что я делаю не так? Заранее спасибо.

Примечание: использование UniqueID для создания идентификатора используется для предотвращения коллизий при многократном использовании моего элемента управления.

ответ

0

Я выяснил, в чем проблема. Я еще не знаю почему, но свойство ID управления не должно содержать символ '$'. В моем случае свойство UniqueID возвращало строку типа «ctl00 $ MainContent $ ctl00 ', поэтому полный идентификатор элемента управления был« Имя-ctl00 $ MainContent $ ctl00'. Замена «$» другим символом (для сохранения уникальности) решает проблему. Кстати, Метод FindControl также начал работать.

_textBoxName.ID = "Name_" + UniqueID.Replace('$', '_') 

Также обратите внимание, что символ «-» в качестве ID валидатора вызовет синтаксическую ошибку в JS (как ASP.NET будет пытаться создавать объекты JS с тем же именем), поэтому не рекомендуется использовать его как ,

1

On_Init слишком рано, поскольку элементы управления не будут созданы в этой точке.

+0

Слишком рано для чего?) Я вручную инициализирую и добавляю элементы управления в коллекцию, а затем могу их найти, но не используя метод * FindControl * (это, к сожалению, означает, что средство проверки поля не может сделать то же самое). Однако я переместил элементы управления в обработчик OnLoad - ошибка остается. – Eadel

Смежные вопросы