2012-07-03 3 views
1

Я создал пользовательский элемент управления, который имеет некоторую проверку на стороне клиента. Я встраиваю Javascript через RegisterStartupScript и передаю информацию на проверку через RegisterExpandoAttribute. Однако пользовательский элемент управления не отображается на странице Load, и когда я использую document.getElementById, я получаю нулевые значения.Проверка на стороне клиента пользовательского элемента управления, который не отображается на странице Загрузка

Вот мой текущий код:

public void Page_Load(object sender, EventArgs e) 
    { 
      ClientScriptManager cs = Page.ClientScript; 
      Type cstype = this.GetType(); 
      if (!cs.IsStartupScriptRegistered(cstype, "ValidatorType")) 
      { 
       String DateValidator; 
       DateValidator = "<script type=\"text/javascript\">\n"; 
       DateValidator += "function ValidateDate(source, args) {\n"; 
       DateValidator += " var ddDay = document.getElementById(source.day);\n"; 
       DateValidator += " var day = ddDay.selectedIndex;\n"; 
       DateValidator += " var ddMonth = document.getElementById(source.month);\n"; 
       DateValidator += " var month = ddMonth.selectedIndex;\n"; 
       DateValidator += " var ddYear = document.getElementById(source.year);\n"; 
       DateValidator += " var year = ddYear.selectedIndex;\n"; 
       DateValidator += " if (day == 0 || month == 0 || year == 0)\n"; 
       DateValidator += "  args.IsValid = false;\n"; 
       DateValidator += " else\n"; 
       DateValidator += "  args.IsValid = true;\n"; 
       DateValidator += " }\n"; 
       DateValidator += "</script>"; 
       cs.RegisterStartupScript(cstype, "ValidatorType", DateValidator); 
      } 

      cs.RegisterExpandoAttribute(reqDueDate.ClientID, "month", ddMonth.ClientID); 
      cs.RegisterExpandoAttribute(reqDueDate.ClientID, "day", ddDay.ClientID, false); 
      cs.RegisterExpandoAttribute(reqDueDate.ClientID, "year", ddYear.ClientID, false); 
    } 

Ошибки, которые я получаю, являются:

Uncaught TypeError: Cannot set property 'month' of null 
Uncaught TypeError: Cannot read property 'selectedIndex' of null 

ответ

1

управления, которая не видна на стороне сервера не приходит в HTML на клиенте генерируется сервером , Поэтому он должен быть нулевым. Сделать его невидимым скрытым с помощью javascript и сделать его видимым снова, когда требуется с помощью javascript.

Сценарий должен выполняться после рендеринга элементов управления.

Хиддинг серверный элемент управления на клиенте

document.getElementById('<%= pnlMail.ClientID %>').style.display = 'none'; 

Хиддинг управления HTML на клиенте

document.getElementById('htmlControlID').style.display = 'none'; 
+0

Получить обладатель места в браузере и скрыть его с помощью JavaScript. Предположим, что ваш владелец места имеет id pnlMain, тогда вы можете скрыть его с помощью document.getElementById ('<% = pnlMail.ClientID%>'). Style.display = 'none'; – Adil

0

Более «на стороне сервера» подходом было бы установить значение на сервер, тогда вы не зависите от javascript. ASCX:

<asp:TextBox runat="server" ID="uxToHide" /> 

Code-за:

protected void Page_Load(object sender, EventArgs e) 
    { 
     uxToHide.Style.Add("display", "none"); 
    } 

Использование заполнителей добавляет немного сложности, но это не так уж плохо. ASCX:

<asp:PlaceHolder ID="uxToHide" runat="server" /> 

Code-за:

protected void Page_Load(object sender, EventArgs e) 
    { 
     TextBox tb = new TextBox(); 
     tb.Style["display"] = "none"; 
     uxToHide.Controls.Add(tb); 

     ShowChildren(uxToHide); 
    } 

    public static void HideChildren(Control container) 
    { 
     if (container == null || container.Controls == null || container.Controls.Count == 0) 
     { 
      return; 
     } 
     foreach (Control c in container.Controls) 
     { 
      if (c is WebControl) 
      { 
       ((WebControl)c).Style["display"] = "none"; 
      } 
      HideChildren(c); 
     } 
    } 

    public static void ShowChildren(Control container) 
    { 
     if (container == null || container.Controls == null || container.Controls.Count == 0) 
     { 
      return; 
     } 
     foreach (Control c in container.Controls) 
     { 
      if (c is WebControl) 
      { 
       WebControl wc = (WebControl)c; 
       if (wc.Style["display"] == "none") 
       { 
        wc.Style.Remove("display"); 
       } 
      } 
      ShowChildren(c); 
     } 
    } 
Смежные вопросы