2012-11-01 53 views
2

我在此問題的項目中陷入困境。 Google搜索了很多,但沒有得到解決方案。複合控件中的自定義驗證器未觸發

我的目標是創建一個帶有標籤,文本框,兩個必需字段驗證程序和一個自定義驗證程序的複合控件。我的自定義控件的代碼如下: -

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Linq; 
using System.Text; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

namespace AFGISServerControl 
{ 
    [ToolboxData("<{0}:ValidatorTextBox runat="\""server\"> </{0}:ValidatorTextBox>")] 
    public class ValidatorTextBox : CompositeControl 
    { 
     private TextBox InputTextBox; 
     private Label InputLabel; 
     private RequiredFieldValidator RequiredValidator1; 
     private RequiredFieldValidator RequiredValidator2; 
     private CustomValidator cv; 
     private static readonly object EventValidateKey = new object(); 

     protected override void OnLoad(EventArgs e) 
     { 
      EnsureChildControls(); 
      base.OnLoad(e); 
     } 
     protected override void CreateChildControls() 
     { 
      Controls.Clear(); 
      InputTextBox = new TextBox(); 
      InputLabel = new Label(); 
      InputTextBox.ID = "inputTextBox"; 
      //InputTextBox.AutoPostBack = true; 

      RequiredValidator1 = new RequiredFieldValidator(); 
      RequiredValidator1.ID = this.ID + "_RFV1"; 
      RequiredValidator1.ControlToValidate = InputTextBox.ID; 
      RequiredValidator1.ValidationGroup = string.Empty; 
      RequiredValidator1.Display = ValidatorDisplay.Dynamic; 
      RequiredValidator1.ErrorMessage = Caption.ToString() + " is mandatory"; 

      RequiredValidator2 = new RequiredFieldValidator(); 
      RequiredValidator2.ID = this.ID + "_RFV2"; 
      RequiredValidator2.ControlToValidate = InputTextBox.ID; 
      RequiredValidator2.Display = ValidatorDisplay.Dynamic; 
      RequiredValidator2.ErrorMessage = Caption.ToString() + " is mandatory"; 

      cv = new CustomValidator(); 
      cv.ID = this.ID + "_CV"; 
      cv.ControlToValidate = InputTextBox.ID; 
      cv.SetFocusOnError = true; 
      cv.Display = ValidatorDisplay.Dynamic; 
      cv.ErrorMessage = this.CustomErrorMessage; 
      cv.ValidateEmptyText = true; 
      cv.ServerValidate += new System.Web.UI.WebControls.ServerValidateEventHandler(this.cv_ServerValidate); 

      this.Controls.Add(InputLabel); 
      this.Controls.Add(InputTextBox); 
      this.Controls.Add(RequiredValidator1); 
      this.Controls.Add(RequiredValidator2); 
      this.Controls.Add(cv); 
     } 

     #region properties 
     [ 
     Bindable(true), 
     Category("Default"), 
     DefaultValue(""), 
     Description("Value") 
     ] 
     public string Text 
     { 
      get 
      { 
       EnsureChildControls(); 
       return InputTextBox.Text; 
      } 
      set 
      { 
       EnsureChildControls(); 
       InputTextBox.Text = value; 
      } 
     } 
     [ 
     Bindable(true), 
     Category("Default"), 
     DefaultValue(""), 
     Description("Validation Group") 
     ] 
     public string ValidationGroup 
     { 
      get 
      { 
       EnsureChildControls(); 
       return InputTextBox.ValidationGroup; 
      } 
      set 
      { 
       EnsureChildControls(); 
       InputTextBox.ValidationGroup = value; 
       RequiredValidator2.ValidationGroup = value; 
       cv.ValidationGroup = value; 
      } 
     } 
     [ 
     Bindable(true), 
     Category("Default"), 
     DefaultValue(""), 
     Description("Error message for the custom validator.") 
     ] 
     public string CustomErrorMessage 
     { 
      get 
      { 
       EnsureChildControls(); 
       return cv.ErrorMessage; 
      } 
      set 
      { 
       EnsureChildControls(); 
       cv.ErrorMessage = value; 
      } 
     } 
     [ 
     Bindable(true), 
     Category("Default"), 
     DefaultValue(""), 
     Description("Validity of custom validator.") 
     ] 
     public Boolean isValid 
     { 
      get 
      { 
       EnsureChildControls(); 
       return cv.IsValid; 
      } 
      set 
      { 
       EnsureChildControls(); 
       cv.IsValid = value; 
      } 
     } 

     [ 
     Bindable(true), 
     Category("Default"), 
     DefaultValue(""), 
     Description("The text for the name label.") 
     ] 
     public string Caption 
     { 
      get 
      { 
       EnsureChildControls(); 
       return InputLabel.Text; 
      } 
      set 
      { 
       EnsureChildControls(); 
       InputLabel.Text = value; 
      } 
     } 
     #endregion 

     protected override void RecreateChildControls() 
     { 
      EnsureChildControls(); 
     } 

     [ 
     Category("Action"), 
     Description("Raised on Text Change") 
     ] 
     public event ServerValidateEventHandler Validate 
     { 
      add 
      { 
       Events.AddHandler(EventValidateKey, value); 
      } 
      remove 
      { 
       Events.RemoveHandler(EventValidateKey, value); 
      } 
     } 
     protected virtual void OnValidate(ServerValidateEventArgs args) 
     { 
      EventHandler ValidateHandler = (EventHandler)Events[EventValidateKey]; 
      if (ValidateHandler != null) 
      { 
       ValidateHandler(this, args); 
      } 
     } 
     protected void cv_ServerValidate(object source, ServerValidateEventArgs args) 
     { 
      OnValidate(args); 
     } 

     protected override void Render(HtmlTextWriter writer) 
     { 
      AddAttributesToRender(writer); 
      InputLabel.RenderControl(writer); 
      InputTextBox.RenderControl(writer); 
      RequiredValidator1.RenderControl(writer); 
      RequiredValidator2.RenderControl(writer); 
      cv.RenderControl(writer); 
     }   
    } 
} 

我的aspx代碼

<cc1:ValidatorTextBox ID="ValidatorTextBox1" runat="server" Caption="Service No" 
     CustomErrorMessage="Not Valid" ValidationGroup="test" 
     OnValidate="CVText" /> 
    <asp:Button ID="Button1" runat="server" Text="Button" /> 

aspx.cs

所面臨的具體問題是

背後「的方法
  • 代碼無效「事件未被觸發
  • 必填字段驗證器er ror消息僅顯示「是強制性的」,標題不加前綴。

我會很樂意提供建議。

回答

0

打破頭後,我改變了這種控制的整個方式。提前使用ivalidator。這是一個非常有效的方法。

0

有幾件事情:

  • 你需要調用Page.Validate()或火中的CausesValidation =回傳的源代碼控制如此。確保您在執行驗證時不指定ValidationGroup或使用「test」ValidationGroup。
  • 在CreateChildControls期間正在設置必需的字段驗證程序。您的標題正在從輸入文本中提取,直到發佈後纔會被填充。在加載ViewState之前,您的CreateChildControls可能會發生。您可能希望使用JavaScript來設置RequiredFieldValidator文本,或者在文本更改時使用_TextChanged事件處理程序來更新錯誤消息。你採取的方法顯然取決於你的具體用例需求。
+0

謝謝您的建議。 Page.Validate()確實調用了代碼隱藏方法。但其他選項 - CausesVaidation屬性不適用於組合控件 – Sameer

+0

CausesValidation將位於按鈕上,而不一定位於組合控件上。 –

相關問題